啟用索引與條件約束
適用於:SQL ServerAzure SQL 資料庫
Azure SQL 受控執行個體
Microsoft Fabric 中的 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 已重建和啟用。 刪除索引 仍然停用。 創建索引並刪除現有的。 仍然停用。 建立新叢集索引的行為會與 ALTER INDEX ALL REBUILD 相同。
在與叢集索引關聯的非叢集索引上所允許的動作,將視此兩種索引類型的停用或啟用狀態而定。 下表摘要非叢集索引可允許的動作。
非叢集索引動作 當叢集和非叢集索引都已停用時。 當叢集索引已啟用,且非叢集索引處於任一狀態時。 ALTER INDEX REBUILD 此動作會失敗。 此動作會成功。 刪除索引 此動作會成功。 此動作會成功。 建立索引並刪除現有的。 此動作會失敗。 此動作會成功。 重建已停用的壓縮非叢集索引時,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)。