web-dev-qa-db-ja.com

インデックスを再構築できませんが、そうしない理由はありませんか?

再構築が必要なインデックスのみを再構築できるプロセスを作成しました(プロセスをすべて再構築する場合、プロセスには1時間半かかります)。それは見事に機能していますが、特定の1つのインデックスでスタックし、何も表示されません。私がすべき理由。

次のメッセージで失敗します。

メッセージ2725、レベル16、状態2、行1

インデックス 'I_520CUSTVENDRELIDX'に対してオンライン操作を実行できません。インデックスには、データタイプtext、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、または大きなCLRタイプの列 'MEMO'が含まれています。非クラスター化インデックスの場合、列はインデックスのインクルード列である可能性があります。クラスタ化インデックスの場合、列はテーブルのどの列でもかまいません。 DROP_EXISTINGが使用されている場合、列は新しいインデックスまたは古いインデックスの一部である可能性があります。操作はオフラインで実行する必要があります。

しかし、次に示す this chap の提案に基づいてクエリを実行すると、結果が得られません。

SELECT *
FROM sys.index_columns AS ic
INNER JOIN sys.columns AS c
ON ic.object_id = c.object_id
AND ic.column_id = c.column_id
AND ((c.system_type_id IN (34,35,99,241)) -- image, text, ntext, xml
 OR (c.system_type_id IN (167,231,165) -- varchar, nvarchar, varbinary
     AND max_length = -1))
INNER JOIN sys.indexes as si
on si.object_id = ic.object_id
AND ic.index_id = si.index_id
inner join sys.tables t
on t.object_id = ic.object_id
where t.name = 'CONTACTPERSON'
and si.name = 'I_520CUSTVENDRELIDX'

さらに、問題のインデックスを手動で検査しても、テキスト、ntext、image、xml、またはvarchar(MAX)、nvarchar(MAX)、varbinary(MAX)は表示されません。私がここで見逃しているものはありますか?

レコードの場合、これはクラスター化インデックスです。

6
Aaron Mason

私はコード例をスキップして、ここで本当の質問のように見えるところにジャンプしました

さらに、問題のインデックスを手動で検査しても、テキスト、ntext、image、xml、またはvarchar(MAX)、nvarchar(MAX)、varbinary(MAX)は表示されません。私がここで見逃しているものはありますか?

レコードの場合、これはクラスター化インデックスです。

あなたは確かに何かを欠いており、答えはエラーメッセージの本文にあります:

クラスタ化インデックスの場合、列はテーブルの任意の列である可能性があります

Online Index Operationsの場合、ClusteredインデックスとNon-Clusteredインデックスには違いがあります。
オンラインで再構築するために、両方にBLOB列を含めることはできません。
ただし、非クラスター化インデックスは、その定義に含まれる列(および含まれる列)を「含む」が、
クラスター化インデックスは、すべての列を持つテーブル全体を「含んでいます」。

あなたの場合、MEMOという名前の列があり、これはデータ型text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、または大きなCLR型です。
この列はテーブルの一部なので、クラスター化インデックスの一部です。

オプションは次のとおりです。

  1. REBUILD操作をオフラインで実行する
  2. SQL Server 2012にアップグレードする
  3. 列のデータ型を変更する

オンラインインデックス操作の実行に関するガイドライン

8
Roi Gavish

アーロンは空間データ型を見逃していた。このように変更します。

AND ((c.system_type_id IN (34,35,99,241, 240)) -- image, text, ntext, xml, CLR types
 OR (c.system_type_id IN (167,231,165) -- varchar, nvarchar, varbinary
     AND max_length = -1))

それが簡単な方法です。ただし、データ型hierarchyidは含まれています。 hierarchyid列のインデックスをオンラインで再構築できるかどうかはわかりません。それらを除外したい場合は、次のようにします。

AND ((c.system_type_id IN (34,35,99,241)) -- image, text, ntext, xml
 OR (c.system_type_id IN (167,231,165) -- varchar, nvarchar, varbinary
     AND max_length = -1)
 OR (c.user_type_id IN (129,130) ) )  -- geometry, geography
1
Kenneth Fisher