停用索引和條件約束
此主題描述如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 2012 中停用索引或條件約束。 停用索引會防止使用者存取索引,而停用叢集索引則會防止存取基礎資料表資料。 索引定義會保留在中繼資料內,而索引統計資料會保留在非叢集索引上。 停用檢視上的非叢集或叢集索引,實際上會刪除索引資料。 停用資料表上的叢集索引,則會防止存取資料;這些資料仍留在資料表中,但無法用於資料操作語言 (DML) 作業,除非卸除或重建索引。
本主題內容
開始之前:
限制事項
安全性
使用下列方法停用索引:
SQL Server Management Studio
Transact-SQL
開始之前
限制事項
索引停用時,不會進行維護。
查詢最佳化工具在建立查詢執行計畫時,不會考慮停用的索引。 此外,使用資料表提示來參考已停用索引的查詢會失敗。
您不能建立與現有停用之索引同名的索引。
已停用的索引可將其卸除。
停用唯一索引時,PRIMARY KEY 或 UNIQUE 條件約束,以及從其他資料表參考索引資料行的所有 FOREIGN KEY 條件約束,也會被停用。 停用叢集索引時,基礎資料表上的所有內送和外送 FOREIGN KEY 條件約束也會停用。 當索引停用時,會在警告訊息中列出條件約束名稱。 重建索引之後,必須使用 ALTER TABLE CHECK CONSTRAINT 陳述式來手動啟用所有條件約束。
當關聯的叢集索引停用時,非叢集索引也會自動停用。 直到啟用資料表或檢視上的叢集索引,或卸除資料表上的叢集索引時,才可以啟用非叢集索引。 除非已使用 ALTER INDEX ALL REBUILD 陳述式啟用叢集索引,否則必須以明確方式啟用非叢集索引。
ALTER INDEX ALL REBUILD 陳述式會重建和啟用資料表上所有已停用的索引,除了檢視上的已停用索引。 檢視上的索引必須在個別的 ALTER INDEX ALL REBUILD 陳述式中啟用。
停用資料表上的叢集索引,也會停用參考該資料表之檢視上的所有叢集和非叢集索引。 這些索引與被參考資料表上的那些索引一樣,都必須重建。
除了用於卸除或重建叢集索引,否則無法存取已停用叢集索引的資料列。
當資料表沒有已停用的叢集索引時,您可以在線上重建已停用的非叢集索引。 然而,如果您使用 ALTER INDEX REBUILD 或 CREATE INDEX WITH DROP_EXISTING 陳述式,則一定要以離線方式重建已停用的叢集索引。 如需有關線上索引作業的詳細資訊,請參閱<線上執行索引作業>。
在已停用叢集索引的資料表上,CREATE STATISTICS 陳述式無法成功執行。
當已停用索引,且符合下列情況時,AUTO_CREATE_STATISTICS 資料庫選項會在資料行上建立新的統計資料:
AUTO_CREATE_STATISTICS 設為 ON。
該資料行沒有統計資料。
查詢最佳化期間需要統計資料。
如果叢集索引已停用,DBCC CHECKDB 便無法傳回基礎資料表的相關資訊;相反地,陳述式會報告該叢集索引已停用。 DBCC INDEXDEFRAG 不能用來重組已停用的索引:陳述式會失敗並出現錯誤訊息。 您可以使用 DBCC DBREINDEX 來重建已停用的索引。
建立新的叢集索引可啟用先前停用的非叢集索引。 如需詳細資訊,請參閱<啟用索引與條件約束>。
安全性
權限
若要執行 ALTER INDEX,至少需要資料表或檢視表的 ALTER 權限。
[回到頁首]
使用 SQL Server Management Studio
若要停用索引
在 [物件總管] 中,按一下加號展開資料庫,此資料庫包含您要停用索引的資料表。
按一下加號展開 [資料表] 資料夾。
按一下加號展開要停用索引的資料表。
按一下加號展開 [索引] 資料夾。
以滑鼠右鍵按一下您要停用的索引,然後選取 [停用]。
在 [停用索引] 對話方塊中,確認 [要停用的索引] 方格中有正確索引,然後按一下 [確定]。
停用資料表上的所有索引
在 [物件總管] 中,按一下加號展開資料庫,此資料庫包含您要停用索引的資料表。
按一下加號展開 [資料表] 資料夾。
按一下加號展開要停用索引的資料表。
以滑鼠右鍵按一下 [索引] 資料夾,並選取 [全部停用]。
在 [停用索引] 對話方塊中,確認 [要停用的索引] 方格中有正確索引,然後按一下 [確定]。 若要從 [要停用的索引] 方格中移除索引,請選取索引,然後按下 DELETE 鍵。
[停用索引] 對話方塊中提供下列資訊:
索引名稱
顯示索引的名稱。 在執行期間,此資料行也會顯示代表其狀態的圖示。資料表名稱
顯示建立索引的資料表名稱或檢視名稱。索引類型
顯示索引的類型:[叢集]、[非叢集]、[空間] 或 [XML]。狀態
顯示停用作業的狀態。 執行之後可能的值:空白
執行之前 [狀態] 為空白。
進行中
已經開始停用索引,但尚未完成。
成功
已成功地完成停用作業。
錯誤
停用索引作業期間發生錯誤,未成功地完成作業。
已停止
因為使用者停止作業,所以未成功地完成停用索引。
訊息
提供停用作業期間錯誤訊息的文字。 在執行期間,會以超連結顯示錯誤。 超連結的文字會描述錯誤的主體。 [訊息] 資料行通常寬度不足以讀取完整訊息文字。 取得完整文字有兩種方式:將滑鼠指標移至訊息資料格上,即可顯示具有錯誤文字的工具提示。
按一下超連結即可顯示含有完整錯誤的對話方塊。
[回到頁首]
使用 Transact-SQL
若要停用索引
在 [物件總管] 中,連接到 Database Engine 的執行個體。
在標準列上,按一下 [新增查詢]。
將下列範例複製並貼到查詢視窗中,然後按一下 [執行]。
USE AdventureWorks2012; GO -- disables the IX_Employee_OrganizationLevel_OrganizationNode index -- on the HumanResources.Employee table ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee DISABLE;
停用資料表上的所有索引
在 [物件總管] 中,連接到 Database Engine 的執行個體。
在標準列上,按一下 [新增查詢]。
將下列範例複製並貼入查詢視窗中,然後按一下 [執行]。
USE AdventureWorks2012; GO -- Disables all indexes on the HumanResources.Employee table. ALTER INDEX ALL ON HumanResources.Employee DISABLE;
如需詳細資訊,請參閱<ALTER INDEX (Transact-SQL)>。
[回到頁首]