ALTER INDEX (Transact-SQL)

インデックスの無効化、再構築、再構成によって、またはインデックスに関するオプションの設定によって、既存のテーブルやビュー インデックス (リレーショナルまたは XML) を変更します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

ALTER INDEX { index_name | ALL }
    ON <object>
    { REBUILD 
        [ [PARTITION = ALL]
          [ WITH ( <rebuild_index_option> [ ,...n ] ) ] 
          | [ PARTITION =partition_number 
                [ WITH ( <single_partition_rebuild_index_option>
                        [ ,...n ] )
                ] 
            ]
        ]
    | DISABLE
    | REORGANIZE 
        [ PARTITION =partition_number ]
        [ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
  | SET ( <set_index_option> [ ,...n ] ) 
    }
[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ]
    table_or_view_name
}

<rebuild_index_option > ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR =fillfactor 
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | ONLINE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP =max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE } 
     [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
     [ , ...n ] ) ]
}
<range> ::= 
<partition_number_expression> TO <partition_number_expression>
}

<single_partition_rebuild_index_option> ::=
{
    SORT_IN_TEMPDB = { ON | OFF }
  | MAXDOP =max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE } }
}

<set_index_option>::=
{
    ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
}

引数

  • index_name
    インデックスの名前を指定します。インデックス名は、テーブルまたはビュー内では一意であることが必要ですが、データベース内では一意である必要はありません。インデックス名は、識別子の規則に従っている必要があります。

  • ALL
    インデックスの種類に関係なく、テーブルまたはビューに関連付けられているすべてのインデックスを指定します。1 つ以上のインデックスがオフラインまたは読み取り専用のファイル グループにあるか、指定した操作が 1 つ以上のインデックスの種類に許可されていない場合、ALL を指定するとステートメントは失敗します。次の表は、インデックス操作と、許可されないインデックスの種類の一覧です。

    ALL を指定する操作

    テーブル内に存在すると操作が失敗するインデックスの種類

    REBUILD WITH ONLINE = ON

    XML インデックス

    空間インデックス

    ラージ オブジェクト データ型 (image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max)、および xml) の列

    REBUILD PARTITION = partition_number

    非パーティション インデックス、XML インデックス、空間インデックス、または無効化されたインデックス

    REORGANIZE

    ALLOW_PAGE_LOCKS が OFF に設定されたインデックス

    REORGANIZE PARTITION = partition_number

    非パーティション インデックス、XML インデックス、空間インデックス、または無効化されたインデックス

    IGNORE_DUP_KEY = ON

    空間インデックス

    XML インデックス

    ONLINE = ON

    空間インデックス

    XML インデックス

    ALL を PARTITION = partition_number と共に指定する場合、すべてのインデックスを固定する必要があります。つまり、すべてのインデックスは、等価パーティション関数に基づいてパーティション分割されます。ALL を PARTITION 句と共に使用すると、同じ partition_number のすべてのインデックス パーティションが再構築または再構成されることになります。パーティション インデックスの詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。

  • database_name
    データベースの名前を指定します。

  • schema_name
    テーブルまたはビューが属するスキーマの名前を指定します。

  • table_or_view_name
    インデックスに関連付けられているテーブルまたはビューの名前を指定します。オブジェクトに関するインデックスのレポートを表示するには、sys.indexes カタログ ビューを使用します。

  • REBUILD [ WITH (<rebuild_index_option> [ ,... n]) ]
    同じ列、インデックスの種類、一意性属性、および並べ替え順に従って、インデックスを再構築します。この句には DBCC DBREINDEX と同じ機能があります。REBUILD では、無効化されたインデックスが有効になります。クラスター化インデックスを再構築しても、キーワード ALL を指定しない限り、関連付けられている非クラスター化インデックスは再構築されません。インデックス オプションを指定しない場合は、sys.indexes に格納されている既存のインデックス オプション値が適用されます。値が sys.indexes に格納されていないインデックス オプションについては、オプションの引数に定義されている既定値が適用されます。

    オプション ONLINE = ON および IGNORE_DUP_KEY = ON は、XML インデックスや空間インデックスの再構築では無効になります。

    ALL を指定した場合で、基になるテーブルがヒープの場合、テーブルは再構築操作の影響を受けません。テーブルに関連付けられている非クラスター化インデックスは再構築されます。

    データベース復旧モデルが一括ログ復旧モデルまたは単純復旧モデルのいずれかに設定されている場合、再構築操作のログへの記録は最小限にできます。詳細については、「インデックス操作の復旧モデルの選択」を参照してください。

    注意注意

    プライマリ XML インデックスを再構築するとき、基になるユーザー テーブルはインデックス操作の間使用できなくなります。

  • PARTITION
    インデックスの 1 つのパーティションのみを再構築または再構成します。PARTITION は、index_name がパーティション インデックス以外の場合は指定できません。

    PARTITION = ALL により、すべてのパーティションが再構築されます。

  • partition_number
    再構築または再構成するパーティション インデックスのパーティション番号を指定します。partition_number には、変数を参照できる定数式を指定します。これらの変数には、ユーザー定義型変数または関数、およびユーザー定義関数などを指定できますが、Transact-SQL ステートメントを参照することはできません。partition_number は必須であり、指定しないとステートメントは失敗します。

  • WITH (<single_partition_rebuild_index_option>)
    SORT_IN_TEMPDB、MAXDOP、および DATA_COMPRESSION は、単一のパーティションを再構築するとき (PARTITION = n) に指定できるオプションです。XML インデックスは、単一のパーティションの再構築操作では指定できません。

    パーティション インデックスの再構築はオンラインでは実行できません。この操作中、すべてのテーブルがロックされます。

  • DISABLE
    インデックスを無効とマークし、データベース エンジンで使用されないようにします。どのインデックスも無効にできます。無効になったインデックスのインデックス定義は、基になるインデックス データがなくてもシステム カタログに残ります。クラスター化インデックスを無効にすると、ユーザーは基になるテーブルのデータにアクセスできなくなります。インデックスを有効にするには、ALTER INDEX REBUILD または CREATE INDEX WITH DROP_EXISTING を使用します。詳細については、「インデックスの無効化」を参照してください。

  • REORGANIZE
    インデックスのリーフ レベルを再構成します。この句には DBCC INDEXDEFRAG と同じ機能があります。ALTER INDEX REORGANIZE ステートメントは、常にオンラインで実行されます。つまり、ALTER INDEX REORGANIZE トランザクション中は、長期にわたって他をブロックするテーブル ロックは保持されず、基になるテーブルへのクエリまたは更新を続行できます。REORGANIZE は、無効化されたインデックスまたは ALLOW_PAGE_LOCKS が OFF に設定されているインデックスに対しては指定できません。

  • WITH ( LOB_COMPACTION = { ON | OFF } )
    ラージ オブジェクト (LOB) データを含むすべてのページを圧縮します。LOB データ型は、image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max)、および xml です。このデータを圧縮すると、ディスク領域をより効率よく使用できます。既定値は ON です。

    • ON
      ラージ オブジェクト データを含むすべてのページが圧縮されます。

      特定のクラスター化インデックスを再構成すると、クラスター化インデックスに含まれるすべての LOB 列が圧縮されます。非クラスター化インデックスを再構成すると、インデックス内で非キー列 (付加列) となっているすべての LOB 列が圧縮されます。詳細については、「付加列インデックスの作成」を参照してください。

      ALL を指定すると、指定したテーブルまたはビューに関連付けられているすべてのインデックスは再構成され、クラスター化インデックスに関連付けられているすべての LOB 列、基になるテーブル、または付加列のある非クラスター化インデックスは圧縮されます。

    • OFF
      ラージ オブジェクト データを含むページは圧縮されません。

      OFF の指定は、ヒープには影響しません。

    LOB_COMPACTION 句は、LOB 列が存在しない場合無視されます。

  • SET ( <set_index option> [ ,... n] )
    インデックスを再構築または再構成しないでインデックス オプションを指定します。無効化されたインデックスには、SET は指定できません。

  • PAD_INDEX = { ON | OFF }
    インデックスの埋め込みを指定します。既定値は OFF です。

    • ON
      FILLFACTOR で指定される空き領域のパーセンテージが、インデックスの中間レベルのページに適用されます。PAD_INDEX を ON に設定するときに FILLFACTOR を指定しない場合は、sys.indexes に格納されている FILL FACTOR 値が使用されます。

    • OFF または fillfactor の指定なし
      中間レベルのページは、ほぼ全容量が使用されます。この場合、中間ページのキーのセットに基づき、インデックスに割り当てることのできる 1 行以上の最大サイズが収まる分の領域は残されます。

    詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。

  • FILLFACTOR = fillfactor
    インデックスの作成時や変更時に、データベース エンジンが各インデックス ページのリーフ レベルをどのくらい使用するかを示すパーセンテージを指定します。fillfactor は 1 ~ 100 の整数値です。既定値は 0 です。

    注意注意

    FILL FACTOR 値 0 と 100 の機能は、まったく同じです。

    明示的な FILLFACTOR 設定値は、インデックスの初回作成時または再構築時のみ適用されます。データベース エンジンでは、ページ内で指定されたパーセント分の空領域は動的に保持されません。詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。

    FILL FACTOR 設定を表示するには、sys.indexes を使用します。

    重要な注意事項重要

    データベース エンジンではクラスター化インデックスの作成時にデータが再分配されるため、FILLFACTOR 値を使用してクラスター化インデックスを作成または変更すると、データ用のストレージ領域のサイズに影響が生じます。

  • SORT_IN_TEMPDB = { ON | OFF }
    tempdb に並べ替え結果を格納するかどうかを指定します。既定値は OFF です。

    • ON
      インデックス構築に使用される中間の並べ替え結果が tempdb に格納されます。tempdb がユーザー データベースとは異なるディクス セット上にある場合は、インデックスの作成に必要な時間が短縮されることがありますが、インデックスの構築中に使用されるディスク領域のサイズは増加します。

    • OFF
      中間の並べ替え結果はインデックスと同じデータベースに格納されます。

    並べ替え操作が必要ない場合、または並べ替えをメモリで実行できる場合、SORT_IN_TEMPDB オプションは無視されます。

    詳細については、「tempdb とインデックスの作成」を参照してください。

  • IGNORE_DUP_KEY = { ON | OFF }
    挿入操作で、一意のインデックスに重複するキー値を挿入しようとした場合のエラー応答を指定します。IGNORE_DUP_KEY オプションは、インデックスが作成または再構築された後の挿入操作のみに適用されます。CREATE INDEXALTER INDEX、または UPDATE を実行した場合、このオプションは無効です。既定値は OFF です。

    • ON
      重複したキー値が一意のインデックスに挿入されると、警告メッセージが表示されます。一意性制約に違反する行のみが失敗します。

    • OFF
      重複したキー値が一意のインデックスに挿入されると、エラー メッセージが表示されます。INSERT 操作全体がロールバックされます。

    ビューで作成されるインデックス、一意ではないインデックス、XML インデックス、空間インデックス、およびフィルター選択されたインデックスに対して、IGNORE_DUP_KEY は ON に設定できません。

    IGNORE_DUP_KEY を表示するには、sys.indexes を使用します。

    旧バージョンと互換性のある構文では、WITH IGNORE_DUP_KEY は WITH IGNORE_DUP_KEY = ON と同じです。

  • STATISTICS_NORECOMPUTE = { ON | OFF }
    分布統計を再計算するかどうかを指定します。既定値は OFF です。

    • ON
      古い統計情報は、自動的には再計算されません。

    • OFF
      自動統計更新が有効です。

    自動統計更新を復元するには、STATISTICS_NORECOMPUTE を OFF に設定するか、NORECOMPUTE 句を指定せずに UPDATE STATISTICS を実行します。

    重要な注意事項重要

    分布統計の自動再計算を無効にすると、クエリ オプティマイザーで、テーブルに関連するクエリの最適実行プランが選択されなくなる場合があります。

  • ONLINE = { ON | OFF }
    インデックス操作時のクエリとデータ変更で、基になるテーブルと関連するインデックスを使用できるかどうかを指定します。既定値は OFF です。

    XML インデックスまたは空間インデックスの場合、ONLINE = OFF だけがサポートされます。ONLINE を ON に設定すると、エラーが発生します。

    注意注意

    オンラインでのインデックス操作は、SQL Server Enterprise Edition、Developer Edition、および Evaluation Edition でのみ使用できます。

    • ON
      長期のテーブル ロックは、インデックス操作の間は保持されません。インデックス操作の主要フェーズの間、ソース テーブルではインテント共有 (IS) ロックのみが保持されます。これによって、基になるテーブルおよびインデックスに対してクエリや更新を続けることができます。操作の開始時、非常に短い時間、ソース オブジェクトでは共有 (S) ロックが保持されます。また操作の終了時、非クラクタ化インデックスが作成される場合は、短い時間、ソース オブジェクト上で S ロックが保持されます。また、クラスター化インデックスがオンラインで作成または削除されるか、クラスター化または非クラスター化インデックスが再構築される場合は、SCH-M (スキーマ修正) ロックが取得されます。インデックスがローカル一時テーブルで作成される場合、ONLINE は ON にできません。

    • OFF
      テーブル ロックは、インデックス操作の間適用されます。オフラインのインデックス操作で、クラスター化インデックス、空間インデックス、XML インデックスの作成、再構築、削除を行う場合や、非クラスター化インデックスの再構築、削除を行う場合は、テーブルで Sch-M (スキーマ修正) ロックが取得されます。このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。非クラスター化インデックスを作成するオフライン インデックス操作では、テーブルの共有 (S) ロックが取得されます。この場合は、基になるテーブルに対して更新は許可されませんが、SELECT ステートメントなどの読み取り操作は許可されます。

    詳細については、「オンライン インデックス操作の動作原理」を参照してください。ロックの詳細については、「ロック モード」を参照してください。

    インデックスは、グローバル一時テーブル上のインデックスを含めてオンラインで再構築できます。ただし、次のインデックスは例外です。

    • XML インデックス

    • ローカル一時テーブル上のインデックス

    • パーティション インデックスのサブセット (パーティション インデックス全体の再構築はオンラインで実行できます)

    • クラスター化インデックス (基になるテーブルに LOB データ型が含まれる場合)

    • LOB データ型列で定義される非クラスター化インデックス

    テーブルに LOB データ型が含まれていても、これらの列がキーまたは非キー列としてインデックス定義で使用されていなければ、非クラスター化インデックスをオンラインで再構築できます。

  • ALLOW_ROW_LOCKS = { ON | OFF }
    行ロックを許可するかどうかを指定します。既定値は ON です。

    • ON
      インデックスにアクセスするとき、行ロックが許可されます。いつ行ロックを使用するかは、データベース エンジンによって決定されます。

    • OFF
      行ロックは使用されません。

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    ページ ロックを許可するかどうかを指定します。既定値は ON です。

    • ON
      インデックスにアクセスするとき、ページ ロックが許可されます。いつページ ロックを使用するかは、データベース エンジンによって決定されます。

    • OFF
      ページ ロックは使用されません。

    注意注意

    ALLOW_PAGE_LOCKS を OFF に設定した場合、インデックスを再構成することはできません。

  • MAXDOP **=**max_degree_of_parallelism
    インデックス操作では、max degree of parallelism 構成オプションを無効にします。詳細については、「max degree of parallelism オプション」を参照してください。並列プランの実行で使用されるプロセッサ数を制限するには、MAXDOP を使用します。最大数は 64 プロセッサです。

    重要な注意事項重要

    MAXDOP オプションはすべての XML インデックスで構文的にサポートされていますが、空間インデックスまたはプライマリ XML インデックスの場合、現在の ALTER INDEX で使用されるプロセッサは 1 つだけです。

    max_degree_of_parallelism には次のデータを指定できます。

    • 1
      並列プランの生成を抑制します。

    • >1
      並列インデックス操作で使用される最大プロセッサ数を指定した数に制限します。

    • 0 (既定値)
      現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。

    詳細については、「並列インデックス操作の構成」を参照してください。

    注意注意

    並列インデックス操作は、SQL Server Enterprise Edition、Developer Edition、および Evaluation Edition でのみ使用できます。

  • DATA_COMPRESSION
    指定したインデックス、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。オプションは次のとおりです。

    • NONE
      インデックスまたは指定したパーティションが圧縮されません。

    • ROW
      行の圧縮を使用して、インデックスまたは指定したパーティションが圧縮されます。

    • PAGE
      ページの圧縮を使用して、インデックスまたは指定したパーティションが圧縮されます。

    圧縮の詳細については、「圧縮されたテーブルおよびインデックスの作成」を参照してください。

  • ON PARTITIONS ( { <partition_number_expression> | <range> } [,...n] )
    DATA_COMPRESSION 設定の適用先となるパーティションを指定します。インデックスがパーティション分割されていない場合に ON PARTITIONS 引数を使用すると、エラーが発生します。ON PARTITIONS 句を指定しないと、パーティション インデックスのすべてのパーティションに対して DATA_COMPRESSION オプションが適用されます。

    <partition_number_expression> は以下の方法で指定できます。

    • ON PARTITIONS (2) などのように、1 つのパーティションの番号を指定します。

    • ON PARTITIONS (1, 5) などのように、複数のパーティションのパーティション番号をコンマで区切って指定します。

    • ON PARTITIONS (2, 4, 6 TO 8) などのように、範囲と個別のパーティションの両方を指定します。

    <range> は、ON PARTITIONS (6 TO 8) などのように、パーティション番号を TO で区切って指定できます。

    さまざまなパーティションにさまざまな種類のデータ圧縮を設定するには、次のように DATA_COMPRESSION オプションを複数回指定します。

    REBUILD WITH 
    (
    DATA_COMPRESSION = NONE ON PARTITIONS (1), 
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), 
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
    )
    

説明

インデックスをパーティションに再分割するか別のファイル グループに移動する場合、ALTER INDEX は使用できません。このステートメントは、列の追加や削除、または列の順序変更など、インデックス定義の変更には使用できません。これらの操作を実行するには、CREATE INDEX を DROP_EXISTING 句と共に使用します。

オプションを明示的に指定しない場合は、現在の設定が適用されます。たとえば、REBUILD 句で FILLFACTOR 設定を指定しなかった場合、再構築処理では、システム カタログに格納されている FILL FACTOR 値が使用されます。現在のインデックス オプション設定を表示するには、sys.indexes を使用します。

注意注意

ONLINE、MAXDOP、および SORT_IN_TEMPDB の値は、システム カタログに格納されません。インデックス ステートメントでオプション値を指定しない限り、各オプションの既定値が使用されます。

マルチプロセッサ コンピューター上では、ALTER INDEX REBUILD は他のクエリと同様、自動的に使用プロセッサの数を増やしてインデックスの変更に関連するスキャンや並べ替え操作を実行します。LOB_COMPACTION の有無に関係なく、ALTER INDEX REORGANIZE を実行すると、max degree of parallelism の値は単一スレッドの操作になります。詳細については、「並列インデックス操作の構成」を参照してください。

インデックスのあるファイル グループがオフラインまたは読み取り専用に設定されていると、インデックスを再構成または再構築することはできません。キーワード ALL を指定した場合で、1 つ以上のインデックスがオフラインまたは読み取り専用のファイル グループにある場合、ステートメントは失敗します。

インデックスの再構築

インデックスの再構築では、インデックスを削除して再作成します。この操作では、断片化をなくし、指定されているか既に存在する FILL FACTOR 設定に基づいてページを圧縮することによりディスク領域を取り戻した後、連続するページにインデックス行を再び並べ替えます。ALL を指定した場合、テーブル上のすべてのインデックスが、1 回のトランザクションで削除され再構築されます。FOREIGN KEY 制約は、前もって削除しておく必要はありません。128 以上のエクステントがあるインデックスを再構築すると、データベース エンジンでは、トランザクションがコミットされるまで実際のページの割り当て解除とそれに関連するロックが延期されます。詳細については、「ラージ オブジェクトの削除と再構築」を参照してください。

注意注意

小さなインデックスを再構築または再構成しても、多くの場合、断片化が解消することはありません。小さなインデックスのページは、混合エクステントに格納されます。混合エクステントは最大 8 つのオブジェクトで共有されるため、小さなインデックスを再構成または再構築しても、その断片化は解消されない場合があります。混合エクステントの詳細については、「ページとエクステントについて」を参照してください。

以前のバージョンの SQL Server では、非クラスター化インデックスを再構築することで、ハードウェア障害により発生した不一致を修正できる場合がありました。SQL Server 2008 でも、非クラスター化インデックスをオフラインで再構築することで、インデックスとクラスター化インデックス間の不一致を修正できますが、オンラインでインデックスを再構築する場合、既存の非クラスター化インデックスを基に再構築が行われるので、不一致を維持してしまい非クラスター化インデックスの不一致を修復できません。一方、オフラインでインデックスを再構築すると、クラスター化インデックス (ヒープ) のスキャンが行われ、不一致が解消されます。不一致を解消する場合、以前のバージョンと同様に影響を受けたデータをバックアップから復元することをお勧めします。ただし、非クラスター化インデックスをオフラインで再構築しても、インデックスの不一致を修復できます。詳細については、「DBCC CHECKDB (Transact-SQL)」を参照してください。

インデックスの再構成

インデックスの再構成では、最小のシステム リソースが使用されます。この操作では、リーフ レベル ページをリーフ ノードの論理順序 (左から右) に合わせて物理的に並べ替えることにより、テーブルやビュー上にあるクラスター化および非クラスター化インデックスのリーフ レベルをデフラグします。再構成でも、インデックス ページは圧縮されます。圧縮は既存の FILL FACTOR 値に基づいて行われます。FILL FACTOR 設定を表示するには、sys.indexes を使用します。

ALL を指定した場合、テーブル上のクラスター化および非クラスター化両方のリレーショナル インデックスと XML インデックスが再構成されます。ALL を指定した場合は、いくつかの制限が適用されます。「引数」の ALL の定義を参照してください。

詳細については、「インデックスの再編成と再構築」を参照してください。

インデックスの無効化

インデックスを無効化すると、ユーザーはインデックスにアクセスできなくなり、クラスター化インデックスの場合は基になるテーブル データにもアクセスできなくなります。インデックス定義はシステム カタログに残ります。ビュー上で非クラスター化インデックスまたはクラスター化インデックスを物理的に無効にすると、インデックス データが削除されます。クラスター化インデックスを無効にすると、データにアクセスできなくなりますが、データはインデックスが削除または再構築されるまで B ツリーに残ります。このデータは管理されません。有効化または無効化されたインデックスの状態を表示するには、sys.indexes カタログ ビューの is_disabled 列にクエリを実行します。

テーブルがトランザクション レプリケーション パブリケーション内にある場合、主キー列に関連付けられているインデックスを無効にすることはできません。これらのインデックスはレプリケーションに必要です。インデックスを無効にするには、最初にテーブルをパブリケーションから削除する必要があります。詳細については、「データとデータベース オブジェクトのパブリッシュ」を参照してください。

インデックスを有効にするには、ALTER INDEX REBUILD ステートメントまたは CREATE INDEX WITH DROP_EXISTING ステートメントを使用します。ONLINE オプションが ON に設定されていると、無効化されたクラスター化インデックスを再構築できません。詳細については、「インデックスの無効化」を参照してください。

オプションの設定

特定のインデックスに対して、再構築または再構成を行わずに ALLOW_ROW_LOCKS、ALLOW_PAGE_LOCKS、IGNORE_DUP_KEY および STATISTICS_NORECOMPUTE オプションを設定できます。変更された値はすぐにインデックスに適用されます。これらの設定を表示するには、sys.indexes を使用します。詳細については、「インデックス オプションの設定」を参照してください。

行およびページ ロック オプション

ALLOW_ROW_LOCKS = ON かつ ALLOW_PAGE_LOCK = ON の場合は、インデックスにアクセスするとき、行レベル、ページ レベル、およびテーブル レベルのロックが許可されます。データベース エンジンは適切なロックを選択し、行ロックまたはページ ロックをテーブル ロックにエスカレートすることができます。

ALLOW_ROW_LOCKS = OFF かつ ALLOW_PAGE_LOCK = OFF の場合は、インデックスにアクセスするときに、テーブル レベルのロックのみが許可されます。インデックスに対するロックの粒度を構成する場合の詳細については、「インデックスのロックのカスタマイズ」を参照してください。

行またはページ ロック オプションが設定されている場合に ALL を指定すると、この設定はすべてのインデックスに適用されます。基になるテーブルがヒープの場合、この設定は次のように適用されます。

ALLOW_ROW_LOCKS = ON または OFF

ヒープおよび関連する非クラスター化インデックスに適用。

ALLOW_PAGE_LOCKS = ON

ヒープおよび関連する非クラスター化インデックスに適用。

ALLOW_PAGE_LOCKS = OFF

非クラスター化インデックスに完全に適用。この場合、非クラスター化インデックスではすべてのページ ロックが許可されません。ヒープでは、ページに対して共有 (S)、更新 (U) および排他 (X) ロックだけが許可されなくなります。データベース エンジンでは内部目的用にインテント ページ ロック (IS、IU または IX) を引き続き取得できます。

詳細については、「ロックのエスカレーション (データベース エンジン)」を参照してください。

オンライン インデックス操作

インデックスを再構築する場合で ONLINE オプションが ON に設定されている場合、クエリおよびデータ変更で、基になるオブジェクト、テーブルおよび関連インデックスを使用できます。排他テーブル ロックは、変更処理中の非常に短い時間だけ保持されます。

インデックスの再構成は、常にオンラインで実行されます。この処理ではロックが長期間保持されないので、実行中のクエリや更新はブロックされません。

同じテーブルでのオンライン インデックス操作は、次を実行する場合のみ同時に実行できます。

  • 複数の非クラスター化インデックスを作成する。

  • 同じテーブルで異なるインデックスを再構成する。

  • 同じテーブルで重複しないインデックスを再構築する間、別のインデックスを再構成する。

その他すべてのオンライン インデックス操作は、同時に実行しようとしても失敗します。たとえば、同じテーブル上で同時に 2 つ以上のインデックスを再構築したり、同じテーブルで既存のインデックスを再構築する間に新しいインデックスを作成することはできません。

詳細については、「オンラインでのインデックス操作の実行」を参照してください。

空間インデックスに関する制限

空間インデックスを再構築するとき、基になるユーザー テーブルはインデックス操作の間使用できなくなります。これは、空間インデックスがスキーマ ロックを保持するためです。

ユーザー テーブルの PRIMARY KEY 制約は、そのテーブルの列に空間インデックスが定義されているときは変更できません。PRIMARY KEY 制約を変更する場合は、初めにテーブルのすべての空間インデックスを削除してください。PRIMARY KEY 制約を変更した後、各空間インデックスを再作成できます。

単一のパーティションの再構築操作では、空間インデックスを指定できません。ただし、パーティションの完全な再構築では、空間インデックスを指定できます。

BOUNDING_BOX や GRID など、空間インデックス固有のオプションを変更するには、DROP_EXISTING = ON を指定する CREATE SPATIAL INDEX ステートメントを使用するか、空間インデックスを削除して新しく作成します。例については、「CREATE SPATIAL INDEX (Transact-SQL)」を参照してください。

データの圧縮

データ圧縮の詳細については、「圧縮されたテーブルおよびインデックスの作成」を参照してください。

圧縮状態の変更による、テーブル、インデックス、またはパーティションへの影響を評価するには、sp_estimate_data_compression_savings ストアド プロシージャを使用します。

パーティション インデックスには次の制限が適用されます。

  • ALTER INDEX ALL ... を使用しても、固定されていないインデックスがテーブルにあると、そのパーティションの圧縮の設定を変更できません。

  • ALTER INDEX <index> ...REBUILD PARTITION... 構文は、そのインデックスの指定のパーティションを再構築します。

  • ALTER INDEX <index> ...REBUILD WITH... 構文は、そのインデックスのすべてのパーティションを再構築します。

権限

ALTER INDEX を実行するには、少なくとも、テーブルまたはビューの ALTER 権限が必要です。

A. インデックスを再構築する

次の例では、Employee テーブルで単一のインデックスを再構築します。

USE AdventureWorks;
GO
ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee
REBUILD;
GO

B. テーブルですべてのインデックスを再構築し、オプションを指定する

次の例では、キーワード ALL を指定します。この場合、テーブルに関連付けられているすべてのインデックスが再構築されます。ここでは 3 つのオプションを指定します。

USE AdventureWorks;
GO
ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
              STATISTICS_NORECOMPUTE = ON);
GO

C. LOB 圧縮を行いインデックスを再構成する

次の例では、単一のクラスター化インデックスを再構成します。インデックスではリーフ レベルに LOB データ型が含まれるので、このステートメントではラージ オブジェクト データを含むすべてのページが圧縮されます。既定値が ON であるため、WITH (LOB_COMPACTION) オプションの指定は必須ではありません。

USE AdventureWorks;
GO
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto
REORGANIZE ;
GO

D. インデックスにオプションを設定する

次の例では、インデックス AK_SalesOrderHeader_SalesOrderNumber にいくつかのオプションを設定します。

USE AdventureWorks;
GO
ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
    Sales.SalesOrderHeader
SET (
    STATISTICS_NORECOMPUTE = ON,
    IGNORE_DUP_KEY = ON,
    ALLOW_PAGE_LOCKS = ON
    ) ;
GO

E. インデックスを無効にする

次の例では、Employee テーブルで非クラスター化インデックスを無効にします。

USE AdventureWorks;
GO
ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee
DISABLE ;
GO

F. 制約を無効にする

次の例では、PRIMARY KEY インデックスを無効にすることにより PRIMARY KEY 制約を無効にします。基になるテーブルに対する FOREIGN KEY 制約は自動的に無効になり、警告メッセージが表示されます。

USE AdventureWorks;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
DISABLE ;
GO

結果セットでは、次の警告メッセージが返されます。

Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'

on table 'EmployeeDepartmentHistory' referencing table 'Department'

was disabled as a result of disabling the index 'PK_Department_DepartmentID'.

G. 制約を有効にする

次の例では、例 F で無効にした PRIMARY KEY および FOREIGN KEY 制約を有効にします。

PRIMARY KEY 制約は、PRIMARY KEY インデックスを再構築することにより有効にできます。

USE AdventureWorks;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
REBUILD ;
GO

次に FOREIGN KEY 制約を有効にします。

ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO

H. パーティション インデックスを再構築する

次の例では、パーティション インデックス IX_TransactionHistory_TransactionDate のパーティション番号 5 の単一パーティションを再構築します。この例では、パーティション インデックスのサンプルがインストールされていることを前提としています。

USE AdventureWorks;
GO
-- Verify the partitioned indexes.
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);
GO
--Rebuild only partition 5.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO

I. インデックスの圧縮設定を変更する

次の例では、非パーティション テーブルのインデックスを再構築します。

ALTER INDEX IX_INDEX1 
ON T1
REBUILD 
WITH ( DATA_COMPRESSION = PAGE )
GO

その他のデータの圧縮の例については、「圧縮されたテーブルおよびインデックスの作成」を参照してください。

変更履歴

変更内容

無効化されたインデックスを REORGANIZE を使用して失敗したインデックスから削除しました。