適用於: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 |
仍保持停用 |
ALTER INDEX ALL REBUILD |
重建並啟用 |
DROP INDEX |
重建並啟用 |
CREATE INDEX WITH DROP_EXISTING |
仍保持停用 |
建立新的叢集索引時,其行為與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
啟用停用的索引
在 [物件瀏覽器] 中,選取加號以展開包含您要啟用索引的資料表的資料庫。
選取加號以展開 資料表 資料夾。
請點選加號以展開您要啟用索引的資料表。
選取加號以展開索引資料夾。
以滑鼠右鍵按一下您要啟用的索引,然後選取 [重建]。
在 [重建索引] 對話框中,確認正確的索引位於 [要重建的索引] 方格中,然後選取 [確定]。
在資料表上啟用所有索引
在 [物件總管] 中,選取加號以展開包含您要啟用索引的資料表的資料庫。
選取加號以展開 資料表 資料夾。
選擇加號以展開您要啟用索引的資料表。
以滑鼠右鍵按一下 [索引] 資料夾,並選取 [全部重建]。
在 [ 重建索引 ] 對話框中,確認正確的索引位於 [要重建的索引] 方格中,然後選取 [ 確定]。 若要從 [要重建的索引] 方格中移除索引,請選取索引,然後按下 DELETE 鍵。
[重建索引] 對話方塊中提供下列資訊:
使用 Transact-SQL
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 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