次の方法で共有


インデックスと制約を無効にする

このトピックでは、SQL Server Management Studio または Transact-SQL を使用して SQL Server 2014 でインデックスまたは制約を無効にする方法について説明します。 インデックスを無効にすると、ユーザーはインデックスにアクセスできなくなり、基になるテーブル データへのクラスター化インデックスにもアクセスできなくなります。 インデックス定義はメタデータに残り、インデックス統計は非クラスター化インデックスに保持されます。 ビューで非クラスター化インデックスまたはクラスター化インデックスを無効にすると、インデックス データが物理的に削除されます。 テーブルでクラスター化インデックスを無効にすると、データにアクセスできなくなります。データは引き続きテーブルに残りますが、インデックスが削除または再構築されるまで、データ操作言語 (DML) 操作では使用できません。

このトピックについて

開始する前に

制限事項と制約条件

  • インデックスは、無効になっている間は保持されません。

  • クエリ オプティマイザーでは、クエリ実行プランの作成時に無効になっているインデックスは考慮されません。 また、テーブル ヒントを使用して無効なインデックスを参照するクエリは失敗します。

  • 既存の無効なインデックスと同じ名前を使用するインデックスを作成することはできません。

  • 無効になっているインデックスは削除できます。

  • 一意のインデックスを無効にすると、PRIMARY KEY 制約または UNIQUE 制約、および他のテーブルからインデックス付き列を参照するすべての FOREIGN KEY 制約も無効になります。 クラスター化インデックスを無効にすると、基になるテーブルに対するすべての受信および送信 FOREIGN KEY 制約も無効になります。 インデックスが無効になっている場合、制約名は警告メッセージに表示されます。 インデックスを再構築した後、ALTER TABLE CHECK CONSTRAINT ステートメントを使用して、すべての制約を手動で有効にする必要があります。

  • 非クラスター化インデックスは、関連付けられているクラスター化インデックスが無効になると自動的に無効になります。 テーブルまたはビューのクラスター化インデックスが有効になるか、テーブルのクラスター化インデックスが削除されるまで、有効にできません。 ALTER INDEX ALL REBUILD ステートメントを使用してクラスター化インデックスが有効になっていない限り、非クラスター化インデックスを明示的に有効にする必要があります。

  • ALTER INDEX ALL REBUILD ステートメントは、ビューで無効になっているインデックスを除き、テーブルで無効になっているすべてのインデックスを再構築して有効にします。 ビューのインデックスは、別の ALTER INDEX ALL REBUILD ステートメントで有効にする必要があります。

  • テーブルでクラスター化インデックスを無効にすると、そのテーブルを参照するビューのすべてのクラスター化インデックスと非クラスター化インデックスも無効になります。 これらのインデックスは、参照先テーブルのインデックスと同様に再構築する必要があります。

  • 無効になっているクラスター化インデックスのデータ行には、クラスター化インデックスを削除または再構築する以外はアクセスできません。

  • 無効化された非クラスター化インデックスは、テーブルに無効なクラスター化インデックスがない場合にオンラインで再構築できます。 ただし、ALTER INDEX REBUILD または CREATE INDEX WITH DROP_EXISTING ステートメントを使用する場合は、無効になっているクラスター化インデックスをオフラインで常に再構築する必要があります。 オンライン インデックス操作の詳細については、「インデックス 操作をオンラインで実行する」を参照してください。

  • クラスター化インデックスが無効になっているテーブルでは、CREATE STATISTICS ステートメントを正常に実行できません。

  • AUTO_CREATE_STATISTICS データベース オプションは、インデックスが無効で、次の条件が存在する場合に、列に新しい統計を作成します。

    • AUTO_CREATE_STATISTICSが ON に設定されている

    • 列の既存の統計はありません。

    • 統計は、クエリの最適化中に必要です。

  • クラスター化インデックスが無効になっている場合、 DBCC CHECKDB は基になるテーブルに関する情報を返すことができません。代わりに、ステートメントはクラスター化インデックスが無効になっていることを報告します。 DBCC INDEXDEFRAG を使用して無効なインデックスを最適化することはできません。ステートメントはエラー メッセージで失敗します。 DBCC DBREINDEX を使用して、無効なインデックスを再構築できます。

  • 新しいクラスター化インデックスを作成すると、以前に無効にされた非クラスター化インデックスが有効になります。 詳細については、「 インデックスと制約を有効にする」を参照してください。

安全

権限

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

SQL Server Management Studio の使用

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

  1. オブジェクト エクスプローラーで、プラス記号をクリックして、インデックスを無効にするテーブルを含むデータベースを展開します。

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。

  3. プラス記号をクリックして、インデックスを無効にするテーブルを展開します。

  4. プラス記号をクリックして [インデックス] フォルダーを展開します。

  5. 無効にするインデックスを右クリックし、[ 無効] を選択します。

  6. [ インデックスの無効化 ] ダイアログ ボックスで、グリッドを無効にする正しいインデックスが [インデックス ] にあることを確認し、[ OK] をクリックします。

テーブルのすべてのインデックスを無効にするには

  1. オブジェクト エクスプローラーで、プラス記号をクリックして、インデックスを無効にするテーブルを含むデータベースを展開します。

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。

  3. プラス記号をクリックして、インデックスを無効にするテーブルを展開します。

  4. [インデックス] フォルダーを右クリックし、[すべて無効にする] を選択します。

  5. [ インデックスの無効化 ] ダイアログ ボックスで、グリッドを 無効 にするインデックスに正しいインデックスがあることを確認し、[ OK] をクリックします。 インデックスからインデックスを削除 してグリッドを無効 にするには、インデックスを選択し、Delete キーを押します。

[ インデックスの無効化 ] ダイアログ ボックスでは、次の情報を使用できます。

インデックス名
インデックスの名前を表示します。 実行中、この列には状態を表すアイコンも表示されます。

テーブル名
インデックスが作成されたテーブルまたはビューの名前を表示します。

インデックスの種類
インデックスの種類 ( クラスター化非クラスター化、 空間または XML) を表示します。

地位
無効化操作の状態を表示します。 実行後に使用できる値は次のとおりです。

  • 空白

    実行前の 状態 は空白です。

  • [実行中]

    インデックスの無効化は開始されましたが、完了していません。

  • 成功

    無効化操作が正常に完了しました。

  • エラー

    インデックスの無効化操作中にエラーが発生し、操作が正常に完了しませんでした。

  • 停止

    ユーザーが操作を停止したため、インデックスの無効化が正常に完了できませんでした。

メッセージ
無効化操作中のエラー メッセージのテキストを提供します。 実行中、エラーはハイパーリンクとして表示されます。 ハイパーリンクのテキストは、エラーの本文を表します。 メッセージ列の幅が、完全なメッセージ テキストを読み取るのに十分な幅になることはほとんどありません。 フルテキストを取得するには、次の 2 つの方法があります。

  • メッセージ セルの上にマウス ポインターを移動して、エラー テキストを含むツールヒントを表示します。

  • ハイパーリンクをクリックすると、完全なエラーを表示するダイアログ ボックスが表示されます。

Transact-SQL の使用

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

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。

    USE AdventureWorks2012;  
    GO  
    -- disables the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table  
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    DISABLE;  
    

テーブルのすべてのインデックスを無効にするには

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。

    USE AdventureWorks2012;  
    GO  
    -- Disables all indexes on the HumanResources.Employee table.  
    ALTER INDEX ALL ON HumanResources.Employee  
    DISABLE;  
    

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