適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric プレビューの SQL データベース
この記事では、SQL Server Management Studio または Transact-SQL を使用して SQL Server で無効なインデックスを有効にする方法について説明します。 インデックスが無効になった後は、再構築または削除されるまで、インデックスは無効な状態のままになります。
Limitations
インデックスの再構築後、インデックスを無効にしたために無効にされた制約は、手動で有効にする必要があります。
PRIMARY KEY
および UNIQUE
制約は、関連付けられているインデックスを再構築することによって有効になります。
FOREIGN KEY
またはPRIMARY KEY
制約を参照するUNIQUE
制約を有効にするには、このインデックスを再構築 (有効) する必要があります。
FOREIGN KEY
制約は、 ALTER TABLE CHECK CONSTRAINT
ステートメントを使用して有効になります。
ONLINE
オプションが ON
に設定されている場合、無効になっているクラスター化インデックスの再構築は実行できません。
クラスター化インデックスが無効または有効で、非クラスター化インデックスが無効になっている場合、クラスター化インデックスの操作により、無効化された非クラスター化インデックスには、次のような影響があります。
クラスター化インデックス操作 | 非クラスター化インデックスの状態を無効にしました |
---|---|
ALTER INDEX REBUILD |
Remains disabled |
ALTER INDEX ALL REBUILD |
再構築して有効にする |
DROP INDEX |
再構築して有効にする |
CREATE INDEX WITH DROP_EXISTING |
Remains disabled |
新しいクラスター化インデックスの作成は、 ALTER INDEX ALL REBUILD
と同じように動作します。
クラスター化インデックスに関連付けられらている非クラスター化インデックスに対して実行できる操作は、これらのインデックスの状態が無効であるか有効であるかによって異なります。 次の表に、非クラスター化インデックスに対して実行できる操作を示します。
非クラスター化インデックスの操作 | クラスター化インデックスと非クラスター化インデックスの両方が無効になっている場合 | クラスター化インデックスが有効で、非クラスター化インデックスがいずれかの状態にある場合 |
---|---|---|
ALTER INDEX REBUILD |
アクションが失敗する | アクションは成功します |
DROP INDEX |
アクションは成功します | アクションは成功します |
CREATE INDEX WITH DROP_EXISTING |
アクションが失敗する | アクションは成功します |
無効にされた圧縮された非クラスター化インデックスを再構築する場合、 data_compression
の既定値は none
になります。つまり、インデックスは圧縮されません。 これは、非クラスター化インデックスが無効になると、圧縮設定のメタデータが失われるためです。 この問題を回避するには、rebuild ステートメントで明示的なデータ圧縮を指定する必要があります。
Permissions
テーブルまたはビューに対する ALTER
権限が必要です。
DBCC DBREINDEX
を使用する場合は、テーブルを所有しているか、sysadmin 固定サーバー ロールのメンバーであるか、db_ddladminのメンバーであるか、固定データベース ロールdb_ownerする必要があります。
SQL Server Management Studio を使用します。
無効なインデックスを有効にする
オブジェクト エクスプローラーで、プラス記号を選択して、インデックスを有効にするテーブルを含むデータベースを展開します。
プラス記号を選択して [テーブル] フォルダーを展開します。
プラス記号を選択して、インデックスを有効にするテーブルを展開します。
プラス記号を選択して 、[インデックス ] フォルダーを展開します。
有効にするインデックスを右クリックし、 [再構築]を選択します。
[ インデックスの再構築 ] ダイアログ ボックスで、グリッドを 再構築する インデックスに正しいインデックスがあることを確認し、[ OK] を選択します。
テーブルのすべてのインデックスを有効にする
オブジェクト エクスプローラーで、プラス記号を選択して、インデックスを有効にするテーブルを含むデータベースを展開します。
プラス記号を選択して [テーブル] フォルダーを展開します。
プラス記号を選択して、インデックスを有効にするテーブルを展開します。
[インデックス] フォルダーを右クリックし、 [すべて再構築]を選択します。
[ インデックスの再構築 ] ダイアログ ボックスで、[再構築するインデックス] グリッドに正しい インデックス があることを確認し、[ OK] を選択します。 [再構築するインデックス] グリッドからインデックスを削除するには、インデックスを選択し、Del キーを押します。
[インデックスの再構築] ダイアログ ボックスには、次の情報が表示されます。
Use Transact-SQL
この記事のコード サンプルでは、AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。
ALTER INDEX を使用して無効なインデックスを有効にする
次の Transact-SQL スクリプトを実行します。 この例では、IX_Employee_OrganizationLevel_OrganizationNode
テーブルでHumanResources.Employee
インデックスを有効にします。
USE AdventureWorks2022;
GO
ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode
ON HumanResources.Employee REBUILD;
GO
CREATE INDEX を使用して無効なインデックスを有効にする
次の Transact-SQL スクリプトを実行します。 次の使用例は、IX_Employee_OrganizationLevel_OrganizationNode
列とHumanResources.Employee
列を使用して、OrganizationLevel
テーブルのOrganizationNode
インデックスを再作成し、既存のIX_Employee_OrganizationLevel_OrganizationNode
インデックスを削除します。
USE AdventureWorks2022;
GO
CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode
ON HumanResources.Employee(OrganizationLevel, OrganizationNode) WITH (DROP_EXISTING = ON);
GO
DBCC DBREINDEX を使用して無効なインデックスを有効にする
Note
この機能は、将来のバージョンの SQL Server で削除される予定です。 新しい開発作業ではこの機能を使用しないでください。現在この機能を使用しているアプリケーションを変更することを計画してください。
次の Transact-SQL スクリプトを実行します。 この例では、IX_Employee_OrganizationLevel_OrganizationNode
テーブルでHumanResources.Employee
インデックスを有効にします。
USE AdventureWorks2022;
GO
DBCC DBREINDEX ("HumanResources.Employee", IX_Employee_OrganizationLevel_OrganizationNode);
GO
ALTER INDEX を使用してテーブルのすべてのインデックスを有効にする
次の Transact-SQL スクリプトを実行します。 この例では、 HumanResources.Employee
テーブルのすべてのインデックスを有効にします。
USE AdventureWorks2022;
GO
ALTER INDEX ALL
ON HumanResources.Employee REBUILD;
GO
DBCC DBREINDEX を使用してテーブルのすべてのインデックスを有効にする
Note
この機能は、将来のバージョンの SQL Server で削除される予定です。 新しい開発作業ではこの機能を使用しないでください。現在この機能を使用しているアプリケーションを変更することを計画してください。
次の Transact-SQL スクリプトを実行します。 この例では、 HumanResources.Employee
テーブルのすべてのインデックスを有効にします。
USE AdventureWorks2022;
GO
DBCC DBREINDEX ("HumanResources.Employee", " ");
GO