共用方式為


停用索引和條件約束

本主題描述如何使用 SQL Server Management Studio 或 Transact-SQL 停用 SQL Server 2014 中的索引或條件約束。 停用索引會防止使用者存取索引,而停用叢集索引則會防止存取基礎資料表資料。 索引定義會保留在中繼資料內,而索引統計資料會保留在非叢集索引上。 停用檢視上的非叢集或叢集索引會實際刪除索引數據。 停用數據表上的叢集索引可防止存取數據;數據仍會保留在數據表中,但在卸除或重建索引之前,數據作語言 (DML) 作業無法使用。

本主題內容

開始之前

限制與制約

  • 當索引被停用時,不會進行維護。

  • 建立查詢執行計劃時,查詢優化器不會考慮停用的索引。 此外,使用資料表提示來參考已停用索引的查詢會失敗。

  • 您無法建立與現有停用索引同名的索引。

  • 禁用的索引可刪除。

  • 停用唯一索引時,PRIMARY KEY 或 UNIQUE 條件約束,以及所有參考其他數據表中這些索引欄位的 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 來重建已停用的索引。

  • 建立新的叢集索引可啟用先前停用的非叢集索引。 如需詳細資訊,請參閱 Enable Indexes and Constraints

安全

權限

若要執行 ALTER INDEX,至少需要對表格或檢視具有 ALTER 權限。

使用 SQL Server Management Studio

停用索引

  1. 在 [物件總管] 中,按一下加號展開資料庫,展開包含您要停用索引的資料表。

  2. 按一下加號展開 [資料表] 資料夾。

  3. 按一下加號符號以展開您想要停用索引的資料表。

  4. 按一下加號符號展開索引資料夾。

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

  6. 在 [ 停用索引] 對話框中,確認正確的索引位於 [要停用的索引 ] 方格中,然後按兩下 [ 確定]。

禁用資料表上的所有索引

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

  2. 按一下加號展開 [資料表] 資料夾。

  3. 按一下加號來展開您要停用索引的資料表。

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

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

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

指數名稱
顯示索引的名稱。 在執行期間,此資料行也會顯示代表其狀態的圖示。

資料表名稱
顯示建立索引的資料表名稱或檢視名稱。

索引類型
顯示索引的類型:[叢集]、[非叢集]、[空間] 或 [XML]

狀態
顯示停用作業的狀態。 執行之後可能的值:

  • 空白

    執行前 的狀態 為空白。

  • 進行中

    索引的停用已開始,但尚未完成。

  • 成功

    已成功地完成停用作業。

  • 錯誤

    索引停用作業期間發生錯誤,且作業未順利完成。

  • 已停止

    因為使用者停止作業,因此索引的停用未順利完成。

訊息
提供停用操作期間錯誤訊息的具體內容。 在執行期間,會以超連結顯示錯誤。 超連結的文字會描述錯誤的主體。 [訊息] 資料行通常寬度不足以讀取完整訊息文字。 取得完整文字有兩種方式:

  • 將滑鼠指標移至訊息儲存格上方,以顯示含有錯誤文字的工具提示。

  • 按一下超連結以顯示完整錯誤的對話框。

使用 Transact-SQL

停用索引

  1. 物件總管中,連線到資料庫引擎實例。

  2. 在標準列上,按一下 [新增查詢]

  3. 複製下列範例並將其貼到查詢視窗中,然後按一下 [執行]

    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;  
    

停用資料表上的所有索引

  1. 物件總管中,連線到資料庫引擎實例。

  2. 在標準列上,按一下 [新增查詢]

  3. 複製下列範例並將其貼到查詢視窗中,然後按一下 [執行]

    USE AdventureWorks2012;  
    GO  
    -- Disables all indexes on the HumanResources.Employee table.  
    ALTER INDEX ALL ON HumanResources.Employee  
    DISABLE;  
    

如需詳細資訊,請參閱 ALTER INDEX (Transact-SQL)