啟用索引與條件約束
適用於:SQL Server、Azure SQL 資料庫 和 Azure SQL 受控執行個體。
此主題說明如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 啟用停用的索引。 在停用索引後,在重建或卸除索引之前仍然是停用狀態。
本主題內容
開始之前:
使用下列方法啟用已停用的索引:
開始之前
限制事項
在重建索引後,任何因為停用索引而停用的條件約束,都必須手動啟用。 重建關聯索引將可啟用 PRIMARY KEY 與 UNIQUE 條件約束。 您必須先重建 (啟用) 索引,才可以啟用參考 PRIMARY KEY 或 UNIQUE 條件約束的 FOREIGN KEY 條件約束。 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',表示將解壓縮索引。 原因是停用非叢集索引時,壓縮設定中繼資料遺失。 若要解決這個問題,您必須在重建陳述式中指定明確的資料壓縮。
安全性
權限
需要資料表或檢視表的 ALTER 權限。 如果使用 DBCC DBREINDEX,使用者必須擁有該資料表,或者是 系統管理員 固定伺服器角色或 db_ddladmin 和 db_owner 固定資料庫角色的成員。
使用 SQL Server Management Studio
啟用已停用的索引
在 [物件總管] 中,按一下加號展開資料庫,此資料庫包含您要啟用索引的資料表。
按一下加號展開 [資料表] 資料夾。
按一下加號展開要啟用索引的資料表。
按一下加號展開 [索引] 資料夾。
以滑鼠右鍵按一下您要啟用的索引,然後選取 [重建]。
在 [重建索引] 對話方塊中,確認 [要重建的索引] 方格中有正確索引,然後按一下 [確定] 。
啟用資料表上的所有索引
在 [物件總管] 中,按一下加號展開資料庫,此資料庫包含您要啟用索引的資料表。
按一下加號展開 [資料表] 資料夾。
按一下加號展開要啟用索引的資料表。
以滑鼠右鍵按一下 [索引] 資料夾,並選取 [全部重建]。
在 [重建索引] 對話方塊中,確認 [要重建的索引] 方格中有正確索引,然後按一下 [確定]。 若要從 [要重建的索引] 方格中移除索引,請選取索引,然後按下 DELETE 鍵。
[重建索引] 對話方塊中提供下列資訊:
使用 TRANSACT-SQL
使用 ALTER INDEX 啟用已停用的索引
在物件總管中,連線到資料庫引擎的執行個體。
在標準列上,按一下 [新增查詢] 。
複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。
USE AdventureWorks2022; GO -- Enables the IX_Employee_OrganizationLevel_OrganizationNode index -- on the HumanResources.Employee table. ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee REBUILD; GO
使用 CREATE INDEX 啟用已停用的索引
在物件總管中,連線到資料庫引擎的執行個體。
在標準列上,按一下 [新增查詢] 。
複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。
USE AdventureWorks2022; GO -- re-creates the IX_Employee_OrganizationLevel_OrganizationNode index -- on the HumanResources.Employee table -- using the OrganizationLevel and OrganizationNode columns -- and then deletes the existing IX_Employee_OrganizationLevel_OrganizationNode index CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee (OrganizationLevel, OrganizationNode) WITH (DROP_EXISTING = ON); GO
使用 DBCC DBREINDEX 啟用已停用的索引
在物件總管中,連線到資料庫引擎的執行個體。
在標準列上,按一下 [新增查詢] 。
複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。
USE AdventureWorks2022; GO -- enables the IX_Employee_OrganizationLevel_OrganizationNode index -- on the HumanResources.Employee table DBCC DBREINDEX ("HumanResources.Employee", IX_Employee_OrganizationLevel_OrganizationNode); GO
使用 ALTER INDEX 啟用資料表上的所有索引
在物件總管中,連線到資料庫引擎的執行個體。
在標準列上,按一下 [新增查詢] 。
複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。
USE AdventureWorks2022; GO -- enables all indexes -- on the HumanResources.Employee table ALTER INDEX ALL ON HumanResources.Employee REBUILD; GO
使用 DBCC DBREINDEX 啟用資料表上的所有索引
在物件總管中,連線到資料庫引擎的執行個體。
在標準列上,按一下 [新增查詢] 。
複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。
USE AdventureWorks2022; GO -- enables all indexes -- on the HumanResources.Employee table DBCC DBREINDEX ("HumanResources.Employee", " "); GO
如需詳細資訊,請參閱 ALTER INDEX (Transact-SQL)、CREATE INDEX (Transact-SQL) 與 DBCC DBREINDEX (Transact-SQL)。