停用索引

停用索引會防止使用者存取索引,停用叢集索引則會防止存取基礎資料表資料。索引定義會保留在中繼資料內,而索引統計資料會保留在非叢集索引上。停用檢視上的非叢集索引或叢集索引,實際上會刪除索引資料。停用資料表上的叢集索引,則會防止存取資料;這些資料仍留在資料表中,但無法用於 DML 作業,除非卸除或重建索引。若要重建並啟用已停用的索引,請使用 ALTER INDEX REBUILD 陳述式或 CREATE INDEX WITH DROP_EXISTING 陳述式。

在下列狀況下,可能會停用一或多個索引:

  • SQL Server 升級期間,SQL Server Database Engine 自動停用索引。

  • 使用 ALTER INDEX 手動停用索引。

SQL Server 升級停用索引

升級到 SQL Server 新版本或新的 Service Pack 期間,當索引或檢視定義包含下列其中一項時,Database Engine 會自動識別並停用索引,包括檢視上的索引:

  • 會讓 Database Engine 無法再保證索引資料完整性的運算式。

    例如,假設索引使用某個系統函數,而在升級時此函數已變更,現在會傳回不同的結果。Database Engine 會在升級期間停用此索引,因為在升級後索引可能包含無效的資料。

  • 在升級過程中已變更的定序,會導致無法正確排序索引。

如果在升級處理期間停用了索引,警告訊息會顯示索引名稱和任何關聯的條件約束名稱,讓您在升級完成之後可以重建它們。重建索引和啟用條件約束,可以更正升級期間失效的資料。

如果 CHECK 條件約束的定義含有運算式,會讓 Database Engine 無法再保證資料的完整性,該 CHECK 條件約束便可能被停用。若要啟用該條件約束,請使用 ALTER TABLE CHECK 陳述式。

使用 ALTER INDEX 停用索引

您可以使用 ALTER INDEX DISABLE 陳述式,隨時以手動方式停用索引。

[!附註]

如果資料表位在交易式複寫發行集內,將無法停用與主索引鍵資料行關聯的任何索引。因為複寫需要這些索引。若要停用索引,您必須先從發行集卸除資料表。如需詳細資訊,請參閱<發行資料和資料庫物件>。

您可能需要停用索引,以便執行下列作業:

  • 更正索引頁上的磁碟 I/O 錯誤 (823 或 824 錯誤),然後再重建索引。

  • 暫時移除索引,以便進行疑難排解。

  • 重建非叢集索引。

    未停用非叢集索引時,重建作業需要足夠的暫存空間來儲存新索引與舊索引。不過,透過在個別的交易中停用和重建非叢集索引,就可以藉由停用可由後續重建或任何其他作業重複使用的索引,來提供可用的磁碟空間。除了用於排序的暫存磁碟空間 (通常是索引大小的 20%),不需要任何其他的空間。

    如果磁碟空間有限,先停用非叢集索引然後再重建會很有用。例如,假設您有一個預存程序,用於重建一或多個資料表中的所有非叢集索引。先在重建作業中停用個別交易的這些索引,即可明顯減少重建索引所需的暫存磁碟空間。

若要停用索引

ALTER INDEX (Transact-SQL)

如何:重建索引 (SQL Server Management Studio)