ALTER INDEX (Transact-SQL)

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

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

構文

ALTER INDEX { index_name | ALL }
    ON <object>
    { REBUILD 
        [ [ 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
}

<single_partition_rebuild_index_option> ::=
{
    SORT_IN_TEMPDB = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
}

<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 インデックス

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

    REBUILD PARTITION = partition_number

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

    REORGANIZE

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

    REORGANIZE PARTITION = partition_number

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

    SET

    無効化されたインデックス

    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 および IGNORE_DUP_KEY は、XML インデックスの再構築では無効になります。

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

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

    ms188388.note(ja-jp,SQL.90).gifメモ :
    プライマリ XML インデックスを再構築するとき、基になるユーザー テーブルはインデックス操作の間使用できなくなります。
  • PARTITION
    インデックスの 1 つのパーティションのみを再構築または再構成します。PARTITION は、index_name がパーティション インデックス以外の場合は指定できません。
  • partition_number
    再構築または再構成するパーティション インデックスのパーティション番号を指定します。partition_number には、変数を参照できる定数式を指定します。これにはユーザー定義型変数または関数、およびユーザー定義関数が含まれますが、Transact-SQL ステートメントを参照することはできません。partition_number は必須であり、指定しないとステートメントは失敗します。
  • WITH (<single_partition_rebuild_index_option>)
    SORT_IN_TEMPDB および MAXDOP は、単一のパーティションを再構築するとき (PARTITION = n) に指定できるオプションです。XML インデックスは、単一のパーティションの再構築操作では指定できません。

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

  • DISABLE
    インデックスを無効とマークし、SQL Server 2005 データベース エンジンで使用されないようにします。どのインデックスも無効にできます。無効になったインデックスのインデックス定義は、基になるインデックス データがなくてもシステム カタログに残ります。クラスタ化インデックスを無効にすると、ユーザーは基になるテーブルのデータにアクセスできなくなります。インデックスを有効にするには、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 データ型は、imagetextntextvarchar(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 です。

    ms188388.note(ja-jp,SQL.90).gifメモ :
    FILL FACTOR 値 0 と 100 の機能は、まったく同じです。

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

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

    ms188388.note(ja-jp,SQL.90).gif重要 :
    データベース エンジンではクラスタ化インデックスの作成時にデータが再分配されるため、FILLFACTOR 値を使用してクラスタ化インデックスを作成または変更すると、データ用のストレージ領域のサイズに影響が生じます。
  • SORT_IN_TEMPDB = { ON | OFF }
    tempdb に並べ替え結果を格納するかどうかを指定します。既定値は OFF です。

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

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

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

  • IGNORE_DUP_KEY = { ON | OFF }
    一意のクラスタ化インデックスまたは一意の非クラスタ化インデックスにおいて、複数行の挿入トランザクションで重複したキー値が見つかった場合の、エラー応答を指定します。既定値は OFF です。

    • ON
      警告メッセージが発行され、UNIQUE インデックスに違反する行のみが失敗します。
    • OFF
      エラー メッセージが発行され、トランザクション全体がロールバックされます。

    IGNORE_DUP_KEY 設定は、インデックスが作成または再構築された後に行われる挿入操作のみに適用されます。インデックス操作中は、この設定は影響しません。IGNORE_DUP_KEY は、UPDATE ステートメントには影響しません。

    XML インデックスと、ビューで作成されるインデックスに対しては、IGNORE_DUP_KEY は ON に設定できません。詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。

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

    • ON
      古い統計情報は、自動的には再計算されません。
    • OFF
      自動統計更新が有効です。

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

    ms188388.note(ja-jp,SQL.90).gif重要 :
    分布統計の自動再計算を無効にすると、クエリ オプティマイザで、テーブルに関連するクエリの最適実行プランが選択されなくなる場合があります。
  • ONLINE = { ON | OFF }
    インデックス操作時のクエリとデータ変更で、基になるテーブルと関連するインデックスを使用できるかどうかを指定します。既定値は OFF です。

    ms188388.note(ja-jp,SQL.90).gifメモ :
    オンライン インデックス操作は、SQL Server 2005 Enterprise Edition でのみ実行できます。
    • ON
      長期のテーブル ロックは、インデックス操作の間は保持されません。インデックス操作の主要フェーズの間、ソース テーブルではインテント共有 (IS) ロックのみが保持されます。これによって、基になるテーブルおよびインデックスに対してクエリや更新を続けることができます。操作の開始時、非常に短い時間、ソース オブジェクトでは共有 (S) ロックが保持されます。また操作の終了時、非クラクタ化インデックスが作成される場合は、短い時間、ソース オブジェクト上で S ロックが保持されます。また、クラスタ化インデックスがオンラインで作成または削除されるか、クラスタ化または非クラスタ化インデックスが再構築される場合は、SCH-M (スキーマ修正) ロックが取得されます。インデックスがローカル一時テーブルで作成される場合は、ONLINE は ON にできません。
    • OFF
      テーブル ロックは、インデックス操作の間適用されます。クラスタ化インデックスを作成、再構築、または削除するオフライン インデックス操作や、非クラスタ化インデックスを再構築または削除するオフライン インデックス操作では、テーブルのスキーマ修正 (Sch-M) ロックが取得されます。このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。非クラスタ化インデックスを作成するオフライン インデックス操作では、テーブルの共有 (S) ロックが取得されます。この場合は、基になるテーブルに対して更新は許可されませんが、SELECT ステートメントなどの読み取り操作は許可されます。

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

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

    • 無効化されたインデックス
    • XML インデックス
    • ローカル一時テーブル上のインデックス
    • パーティション インデックス
    • クラスタ化インデックス (基になるテーブルに LOB データ型が含まれる場合)
    • LOB データ型列で定義される非クラスタ化インデックス

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

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

    • ON
      インデックスにアクセスするとき、行ロックが許可されます。データベース エンジンでは行ロックが使用されるタイミングが決定されます。
    • OFF
      行ロックは使用されません。
  • ALLOW_PAGE_LOCKS = { ON | OFF }
    ページ ロックを許可するかどうかを指定します。既定値は ON です。

    • ON
      インデックスにアクセスするとき、ページ ロックが許可されます。データベース エンジンではページ ロックが使用されるタイミングが決定されます。
    • OFF
      ページ ロックは使用されません。
    ms188388.note(ja-jp,SQL.90).gifメモ :
    ALLOW_PAGE_LOCKS を OFF に設定した場合、インデックスを再構成することはできません。
  • MAXDOP = max_degree_of_parallelism
    インデックス操作では、max degree of parallelism 構成オプションを無効にします。詳細については、「max degree of parallelism オプション」を参照してください。並列プランの実行で使用されるプロセッサ数を制限するには、MAXDOP を使用します。最大数は 64 プロセッサです。

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

    • 1
      並列プラン生成を抑制します。
    • >1
      並列インデックス操作で使用される最大プロセッサ数を、指定数に制限します。
    • 0 (既定値)
      現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。

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

    ms188388.note(ja-jp,SQL.90).gifメモ :
    並列インデックス操作は、SQL Server 2005 Enterprise Edition でのみ実行できます。

解説

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

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

ms188388.note(ja-jp,SQL.90).gifメモ :
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 以上のエクステントがあるインデックスを再構築すると、データベース エンジンでは、トランザクションがコミットされるまで実際のページの割り当て解除とそれに関連するロックが延期されます。詳細については、「ラージ オブジェクトの削除と再構築」を参照してください。

ms188388.note(ja-jp,SQL.90).gifメモ :
通常、小さなインデックスを再構築または再構成しても、多くの場合、断片化が解消することはありません。小さなインデックスのページは、混合エクステントに格納されます。混合エクステントは最大 8 つのオブジェクトで共有されるため、インデックスを再構成または再構築しても、小さなインデックスの断片化は解消されない場合があります。混合エクステントの詳細については、「ページとエクステント」を参照してください。

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

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

権限

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 の単一パーティションを再構築します。この例では、パーティション インデックスのサンプルがインストールされていることを前提としています。インストールについては、「Readme_PartitioningScript」を参照してください。

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

参照

関連項目

CREATE INDEX (Transact-SQL)
sys.dm_db_index_physical_stats
EVENTDATA (Transact-SQL)

その他の技術情報

インデックスの無効化
xml データ型列のインデックス
オンラインでのインデックス操作の実行
インデックスの再編成と再構築

ヘルプおよび情報

SQL Server 2005 の参考資料の入手