インデックスと制約の無効化Disable Indexes and Constraints

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、 SQL Server 2017SQL Server 2017[SQL Server Management Studio]SQL Server Management Studio または Transact-SQLTransact-SQLを使用して、インデックスまたは制約を無効にする方法について説明します。This topic describes how to disable an index or constraints in SQL Server 2017SQL Server 2017 by using [SQL Server Management Studio]SQL Server Management Studio or Transact-SQLTransact-SQL. インデックスを無効にすると、ユーザーはそのインデックスにアクセスできなくなります。クラスター化インデックスの場合は、基になるテーブルのデータにもアクセスできなくなります。Disabling an index prevents user access to the index, and for clustered indexes to the underlying table data. ただし、インデックス定義はメタデータに残り、インデックス統計は非クラスター化インデックス上に保持されます。The index definition remains in metadata, and index statistics are kept on nonclustered indexes. ビュー上で非クラスター化インデックスまたはクラスター化インデックスを無効にすると、インデックス データが物理的に削除されます。Disabling a nonclustered or clustered index on a view physically deletes the index data. テーブルのクラスター化インデックスを無効にすると、データにアクセスできなくなります。つまり、データはテーブルに残りますが、そのインデックスを削除するか再構築するまでは、データ操作言語 (DML) 操作で使用できなくなります。Disabling a clustered index on a table prevents access to the data; the data still remains in the table, but is unavailable for data manipulation language (DML) operations until the index is dropped or rebuilt.

このトピックの内容In This Topic

作業を開始する準備Before You Begin

制限事項と制約事項Limitations and Restrictions

  • 無効なインデックスは保守されません。The index is not maintained while it is disabled.

  • クエリ オプティマイザーは、クエリの実行プランの作成時に無効なインデックスを考慮しません。The query optimizer does not consider the disabled index when creating query execution plans. また、無効化されたインデックスをテーブル ヒントで参照するクエリは失敗します。Also, queries that reference the disabled index with a table hint fail.

  • 無効になっている既存のインデックスと同じ名前のインデックスを作成することはできません。You cannot create an index that uses the same name as an existing disabled index.

  • 無効化されたインデックスは削除できます。A disabled index can be dropped.

  • 一意なインデックスを作成する場合、PRIMARY KEY 制約または UNIQUE 制約と、他のテーブルのインデックス付き列を参照するすべての FOREIGN KEY 制約も無効化されます。When disabling a unique index, the PRIMARY KEY or UNIQUE constraint and all FOREIGN KEY constraints that reference the indexed columns from other tables are also disabled. クラスター化インデックスを無効にする場合、基になるテーブルを参照元または参照先とするすべての FOREIGN KEY 制約も無効になります。When disabling a clustered index, all incoming and outgoing FOREIGN KEY constraints on the underlying table are also disabled. インデックスを無効にすると、警告メッセージに制約名が表示されます。The constraint names are listed in a warning message when the index is disabled. インデックスを再構築した後で、ALTER TABLE CHECK CONSTRAINT ステートメントを使用してすべての制約を手動で有効にする必要があります。After rebuilding the index, all constraints must be manually enabled by using the ALTER TABLE CHECK CONSTRAINT statement.

  • 非クラスター化インデックスは、関連付けられたクラスター化インデックスを無効にすると自動的に無効になります。Nonclustered indexes are automatically disabled when the associated clustered index is disabled. 非クラスター化インデックスを有効にするには、クラスター化インデックスを有効にする (テーブルまたはビューの場合) か、クラスター化インデックスを削除する (テーブルの場合) 必要があります。They cannot be enabled until either the clustered index on the table or view is enabled or the clustered index on the table is dropped. ALTER INDEX ALL REBUILD ステートメントを使用してクラスター化インデックスを有効にした場合を除き、非クラスター化インデックスは明示的に有効にする必要があります。Nonclustered indexes must be explicitly enabled, unless the clustered index was enabled by using the ALTER INDEX ALL REBUILD statement.

  • ALTER INDEX ALL REBUILD ステートメントを実行すると、ビューの無効化されたインデックスを除く、テーブル上の無効化されたインデックスがすべて再構築されて有効になります。The ALTER INDEX ALL REBUILD statement rebuilds and enables all disabled indexes on the table, except for disabled indexes on views. ビューのインデックスは、別の ALTER INDEX ALL REBUILD ステートメントで有効にする必要があります。Indexes on views must be enabled in a separate ALTER INDEX ALL REBUILD statement.

  • テーブルのクラスター化インデックスを無効にすると、そのテーブルを参照しているビューのクラスター化インデックスおよび非クラスター化インデックスもすべて無効になります。Disabling a clustered index on a table also disables all clustered and nonclustered indexes on views that reference that table. このようなインデックスは、参照先テーブルのインデックスと同時に再構築する必要があります。These indexes must be rebuilt just as those on the referenced table.

  • 無効化されたクラスター化インデックスのデータ行には、クラスター化インデックスを削除または再構築する場合以外はアクセスできません。The data rows of the disabled clustered index cannot be accessed except to drop or rebuild the clustered index.

  • 無効化された非クラスター化インデックスは、無効化されたクラスター化インデックスがテーブルに存在しなければオンラインで再構築できます。You can rebuild a disabled nonclustered index online when the table does not have a disabled clustered index. ただし、ALTER INDEX REBUILD ステートメントまたは CREATE INDEX WITH DROP_EXISTING ステートメントのいずれかを使用している場合は常に、無効化されたクラスター化インデックスをオフラインで再構築する必要があります。However, you must always rebuild a disabled clustered index offline if you use either the ALTER INDEX REBUILD or CREATE INDEX WITH DROP_EXISTING statement. オンラインでのインデックス操作の詳細については、「 オンラインでのインデックス操作の実行」を参照してください。For more information about online index operations, see Perform Index Operations Online.

  • クラスター化インデックスが無効になっているテーブルに対して、CREATE STATISTICS ステートメントを正常に実行することはできません。The CREATE STATISTICS statement cannot be successfully executed on a table that has a disabled clustered index.

  • インデックスが無効であり、次の条件に一致する場合、AUTO_CREATE_STATISTICS データベース オプションを指定することで列の新しい統計が作成されます。The AUTO_CREATE_STATISTICS database option creates new statistics on a column when the index is disabled and the following conditions exist:

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

    • 列の統計がまだ存在しないThere are no existing statistics for the column.

    • クエリの最適化で統計が必要であるStatistics are required during query optimization.

  • クラスター化インデックスが無効になっている場合、 DBCC CHECKDB は基になるテーブルに関する情報を返すことができません。代わりに、クラスター化インデックスが無効であることが報告されます。If a clustered index is disabled, DBCC CHECKDB cannot return information about the underlying table; instead, the statement reports that the clustered index is disabled. DBCC INDEXDEFRAG を使用して、無効化されたインデックスの断片化を解消することはできません。このステートメントはエラー メッセージを出力して失敗します。DBCC INDEXDEFRAG cannot be used to defragment a disabled index; the statement fails with an error message. 無効化されたインデックスの再構築には DBCC DBREINDEX を使用できます。You can use DBCC DBREINDEX to rebuild a disabled index.

  • 新しいクラスター化インデックスを作成すると、以前に無効化された非クラスター化インデックスが有効になります。Creating a new clustered index enables previously disabled nonclustered indexes. 詳しくは、「 Enable Indexes and Constraints」をご覧ください。For more information, see Enable Indexes and Constraints.

セキュリティSecurity

PermissionsPermissions

ALTER INDEX を実行するには、少なくとも、テーブルまたはビューの ALTER 権限が必要です。To execute ALTER INDEX, at a minimum, ALTER permission on the table or view is required.

SQL Server Management Studio の使用Using SQL Server Management Studio

インデックスを無効にするにはTo disable an index

  1. オブジェクト エクスプローラーで、インデックスを無効にするテーブルが格納されているデータベースをプラス記号をクリックして展開します。In Object Explorer, click the plus sign to expand the database that contains the table on which you want to disable an index.

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。Click the plus sign to expand the Tables folder.

  3. プラス記号をクリックして、インデックスを無効にするテーブルを展開します。Click the plus sign to expand the table on which you want to disable an index.

  4. プラス記号をクリックして [インデックス] フォルダーを展開します。Click the plus sign to expand the Indexes folder.

  5. 無効にするインデックスを右クリックし、 [無効化] を選択します。Right-click the index you want to disable and select Disable.

  6. [インデックスの無効化] ダイアログ ボックスで、 [無効にするインデックス] グリッドに目的のインデックスが表示されていることを確認し、 [OK] をクリックします。In the Disable Indexes dialog box, verify that the correct index is in the Indexes to disable grid and click OK.

テーブルのすべてのインデックスを無効にするにはTo disable all indexes on a table

  1. オブジェクト エクスプローラーで、インデックスを無効にするテーブルが格納されているデータベースをプラス記号をクリックして展開します。In Object Explorer, click the plus sign to expand the database that contains the table on which you want to disable the indexes.

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。Click the plus sign to expand the Tables folder.

  3. プラス記号をクリックして、インデックスを無効にするテーブルを展開します。Click the plus sign to expand the table on which you want to disable the indexes.

  4. [インデックス] フォルダーを右クリックし、 [すべて無効にする] を選択します。Right-click the Indexes folder and select Disable All.

  5. [インデックスの無効化] ダイアログ ボックスで、 [無効にするインデックス] グリッドに目的のインデックスが表示されていることを確認し、 [OK] をクリックします。In the Disable Indexes dialog box, verify that the correct indexes are in the Indexes to disable grid and click OK. [無効にするインデックス] グリッドからインデックスを削除するには、インデックスを選択し、Del キーを押します。To remove an index from the Indexes to disable grid, select the index and then press the Delete key.

[無効にするインデックス] ダイアログ ボックスには、次の情報が表示されます。The following information is available in the Disable Indexes dialog box:

Index NameIndex Name
インデックスの名前を表示します。Displays the name of the index. 実行中は、状態を表すアイコンもこの列に表示されます。During execution, this column also displays an icon representing the status.

テーブル名Table Name
インデックスが作成されているテーブルまたはビューの名前を表示します。Displays the name of the table or view that the index was created on.

[インデックスの種類]Index Type
インデックスの種類 ( [クラスター化][非クラスター化][空間]、または [XML]) を表示します。Displays the type of the index: Clustered, Nonclustered, Spatial, or XML.

ステータスStatus
無効化操作の状態を表示します。Displays the status of the disable operation. 実行後の値は、次のいずれかになります。Possible values after execution are:

  • 空白Blank

    実行前の [状態] は空白です。Prior to execution Status is blank.

  • [実行中]In progress

    インデックスの無効化操作が開始されましたが、まだ完了していません。Disabling of the indexes has been started but is not complete.

  • SuccessSuccess

    インデックスの無効化操作は正常に終了しました。The disable operation completed successfully.

  • ErrorError

    インデックスの無効化操作の実行中にエラーが発生したため、操作が正常に終了しませんでした。An error was encountered during the index disable operation, and the operation did not complete successfully.

  • 停止Stopped

    インデックスの無効化操作はユーザーによって中止されたため、正常に終了しませんでした。The disable of the index was not completed successfully because the user stopped the operation.

メッセージMessage
無効化操作中にエラー メッセージのテキストを表示します。Provides the text of error messages during the disable operation. 実行中、エラーはハイパーリンクとして表示されます。During execution, errors appear as hyperlinks. エラーの内容は、ハイパーリンクのテキストに示されます。The text of the hyperlinks describes the body of the error. 多くの場合、 [メッセージ] 列が狭いためにメッセージ テキスト全体が表示されません。The Message column is rarely wide enough to read the full message text. テキスト全体を表示するには、次の 2 つの方法があります。There are two ways to get the full text:

  • マウス ポインターをメッセージ セル上に移動して、ツールヒントにエラー テキストが表示されるようにします。Move the mouse pointer over the message cell to display a ToolTip with the error text.

  • ハイパーリンクをクリックして、エラー全体を表示するダイアログ ボックスを開きます。Click the hyperlink to display a dialog box displaying the full error.

Transact-SQL の使用Using Transact-SQL

インデックスを無効にするにはTo disable an index

  1. オブジェクト エクスプローラーで、 データベース エンジンDatabase Engineのインスタンスに接続します。In Object Explorer, connect to an instance of データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ] をクリックします。On the Standard bar, click New Query.

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。Copy and paste the following example into the query window and click Execute.

    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;  
    

テーブルのすべてのインデックスを無効にするにはTo disable all indexes on a table

  1. オブジェクト エクスプローラーで、 データベース エンジンDatabase Engineのインスタンスに接続します。In Object Explorer, connect to an instance of データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ] をクリックします。On the Standard bar, click New Query.

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。Copy and paste the following example into the query window and click Execute.

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

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