啟用索引和條件約束

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體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

啟用停用的索引

  1. 在 [物件瀏覽器] 中,選取加號以展開包含您要啟用索引的資料表的資料庫。

  2. 選取加號以展開 資料表 資料夾。

  3. 請點選加號以展開您要啟用索引的資料表。

  4. 選取加號以展開索引資料夾。

  5. 以滑鼠右鍵按一下您要啟用的索引,然後選取 [重建]。

  6. 在 [重建索引] 對話框中,確認正確的索引位於 [要重建的索引] 方格中,然後選取 [確定]。

在資料表上啟用所有索引

  1. 在 [物件總管] 中,選取加號以展開包含您要啟用索引的資料表的資料庫。

  2. 選取加號以展開 資料表 資料夾。

  3. 選擇加號以展開您要啟用索引的資料表。

  4. 以滑鼠右鍵按一下 [索引] 資料夾,並選取 [全部重建]。

  5. 在 [ 重建索引 ] 對話框中,確認正確的索引位於 [要重建的索引] 方格中,然後選取 [ 確定]。 若要從 [要重建的索引] 方格中移除索引,請選取索引,然後按下 DELETE 鍵。

[重建索引] 對話方塊中提供下列資訊:

使用 Transact-SQL

本文中的程式碼範例使用 AdventureWorks2025、AdventureWorksDW2025 或 AdventureWorksLT2025 範例資料庫,您可以從 Azure Data SQL Samples 儲存庫 GitHub 儲存庫下載。

使用 ALTER INDEX 啟用已停用的索引

執行下列 Transact-SQL 腳本。 這個範例會啟用 IX_Employee_OrganizationLevel_OrganizationNode 數據表上的 HumanResources.Employee 索引。

Note

在 Azure SQL Database 和 Microsoft Fabric 中的 SQL 資料庫中,USE語句都無法使用。 相反地,直接連接到預期的資料庫,執行剩餘的程式碼範例。

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