停用索引
停用索引會防止使用者存取索引,停用叢集索引則會防止存取基礎資料表資料。索引定義會保留在中繼資料內,而索引統計資料會保留在非叢集索引上。停用檢視上的非叢集索引或叢集索引,實際上會刪除索引資料。停用資料表上的叢集索引,則會防止存取資料;這些資料仍留在資料表中,但無法用於 DML 作業,除非卸除或重建索引。若要重建並啟用已停用的索引,請使用 ALTER INDEX REBUILD 陳述式或 CREATE INDEX WITH DROP_EXISTING 陳述式。
在下列狀況下,可能會停用一或多個索引:
- SQL Server 升級期間,SQL Server 2005 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%),不需要任何其他的空間。
如果磁碟空間有限,先停用非叢集索引然後再重建會很有用。例如,假設您有一個預存程序,用於重建一或多個資料表中的所有非叢集索引。先在重建作業中停用個別交易的這些索引,即可明顯減少重建索引所需的暫存磁碟空間。
若要停用索引
如何:重建索引 (SQL Server Management Studio)