共用方式為


啟用索引和條件約束

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

本文說明如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中啟用停用的索引。 停用索引之後,它會保持停用狀態,直到重建或卸除為止。

Limitations

在索引重建之後,因為停用索引而停用的任何條件約束都必須手動啟用。 PRIMARY KEYUNIQUE 限制是透過重建相關聯索引來啟用。 您必須先重建此索引(並啟用),才能啟用參考 FOREIGN KEYPRIMARY 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_ddladmindb_owner固定資料庫角色的成員。

使用 SQL Server Management Studio

啟用停用的索引

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

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

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

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

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

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

在資料表上啟用所有索引

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

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

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

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

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

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

使用 Transact-SQL

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 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.EmployeeOrganizationLevel 欄位重建 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