インデックス DDL 操作に必要なディスク領域
ディスク領域は、インデックスを作成、再構築、または削除するときの重要な考慮事項です。ディスク領域が不足すると、パフォーマンスが低下したり、インデックス操作が失敗したりする場合があります。このトピックでは、インデックス DDL (データ定義言語) 操作に必要なディスク領域を判断するのに役立つ一般的な情報を提供します。
追加のディスク領域を必要としないインデックス操作
次のインデックス操作では、追加のディスク領域は必要ありません。
ALTER INDEX REORGANIZE (ただし、ログ領域は必要です)
DROP INDEX (非クラスタ化インデックスを削除している場合)
DROP INDEX (MOVE TO 句を指定せずにオフラインでクラスタ化インデックスを削除していて、非クラスタ化インデックスが存在しない場合)
CREATE TABLE (PRIMARY KEY 制約または UNIQUE 制約)
追加のディスク領域が必要なインデックス操作
他のすべてのインデックス DDL 操作では、操作中に使用する一時ディスク領域と、新しいインデックス構造を格納する永続的なディスク領域が追加で必要になります。インデックス構造の詳細については、「テーブルとインデックスのデータ構造のアーキテクチャ」を参照してください。
新しいインデックス構造を作成する場合、古い (作成元の) 構造と新しい (作成先の) 構造の両方を格納するディスク領域が、それぞれ適切なファイルおよびファイル グループで必要になります。古い構造の割り当ては、インデックス作成トランザクションがコミットされるまで解除されません。
次のインデックス DDL 操作では、新しいインデックス構造が作成され、追加のディスク領域が必要になります。
CREATE INDEX
CREATE INDEX WITH DROP_EXISTING
ALTER INDEX REBUILD
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY または UNIQUE)
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY または UNIQUE) (制約がクラスタ化インデックスに基づいている場合)
DROP INDEX MOVE TO (クラスタ化インデックスのみ該当)
並べ替え用の一時ディスク領域
作成元の構造と作成先の構造を格納するために必要なディスク領域以外に、並べ替えに使用する一時ディスク領域も必要になります。ただし、クエリ オプティマイザにより、並べ替えを必要としない実行プランが検出された場合は除きます。
並べ替えが必要な場合、一度に 1 つの新しいインデックスに対して並べ替えが実行されます。たとえば、1 つのステートメント内でクラスタ化インデックスと関連する非クラスタ化インデックスを再構築すると、インデックスは順番に並べ替えられます。したがって、並べ替えに必要な追加の一時ディスク領域のサイズは、並べ替えるインデックスの中で最も大きなインデックスのサイズと同じサイズになります。通常は、クラスタ化インデックスのサイズが最も大きくなります。
SORT_IN_TEMPDB オプションを ON に設定した場合は、最も大きいインデックスのサイズが tempdb のサイズを超えないようにする必要があります。このオプションを使用すると、インデックスの作成に使用する一時ディスク領域は増えますが、tempdb がユーザー データベースとは異なるディスク セットにある場合、インデックスの作成に必要な時間を短縮できることがあります。tempdb での並べ替えの詳細については、「tempdb とインデックスの作成」を参照してください。
SORT_IN_TEMPDB を OFF (既定) に設定した場合、パーティション インデックスを含む各インデックスは、作成先のディスク領域で並べ替えられます。この場合、必要になるのは新しいインデックス構造のディスク領域のみです。
ディスク領域の計算例については、「インデックスのディスク領域の例」を参照してください。
オンライン インデックス操作用の一時ディスク領域
インデックス操作をオンラインで実行する場合、追加の一時ディスク領域が必要になります。
クラスタ化インデックスをオンラインで作成、再構築、または削除すると、古いブックマークを新しいブックマークにマップする非クラスタ化インデックスが一時的に作成されます。SORT_IN_TEMPDB オプションを ON に設定した場合、この一時インデックスは tempdb に作成されます。SORT_IN_TEMPDB を OFF に設定した場合は、新しいインデックスと同じファイル グループまたはパーティション構成が使用されます。一時マッピング インデックスには、テーブルの行ごとに 1 つのレコードが格納されます。レコードの内容は、古いブックマーク列と新しいブックマーク列を組み合わせたもので、uniqueifiers とレコード識別子が含まれます。両方のブックマークで使用されている列のコピーは 1 つしか含まれません。オンラインのインデックス操作の詳細については、「オンラインでのインデックス操作の実行」を参照してください。
注意 |
---|
SORT_IN_TEMPDB オプションは、DROP INDEX ステートメントには設定できません。一時マッピング インデックスは、常に新しいインデックスと同じファイル グループまたはパーティション構成に作成されます。 |
オンライン インデックス操作では、行のバージョン管理を使用して、他のトランザクションによる変更がインデックス操作に影響を与えないようにしています。そのため、読み取った行の共有ロックを要求する必要がなくなります。オンライン インデックス操作と同時にユーザーの更新操作と削除操作を実行するには、tempdb にバージョン レコード用の領域が必要になります。詳細については、「オンラインでのインデックス操作の実行」および「行のバージョン管理に基づく分離レベルについて」を参照してください。