執行線上索引作業的指導方針

當您執行線上索引作業時,下列指導方針將適用:

  • 當基礎資料表包含大型物件 (LOB) 資料類型 (image、 ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 與 xml) 時,必須離線建立、重建或卸除叢集索引。

  • 資料表包含 LOB 資料類型,但這些資料行在索引定義中皆不作為索引鍵或無索引鍵 (內含) 資料行時,可以線上建立非唯一的非叢集索引。定義為 LOB 資料類型資料行的非叢集索引必須離線建立或重建。

  • 在本機暫存資料表上不能在線建立、重建或卸除緹引。此限制不適用於全域暫存資料表上的索引。

[!附註]

只有 SQL Server Enterprise、Developer 和 Evaluation 版本上才可使用線上索引作業。

下表顯示可以線上執行的索引作業以及從這些線上作業排除的索引。也包含其他限制。

線上索引作業

排除索引

其他限制

ALTER INDEX REBUILD

已停用叢集索引或已停用索引檢視

XML 索引

本機暫存資料表上的索引

當資料表包含排除索引時,指定關鍵字 ALL 可能導致作業失敗。

重建已停用索引的其他限制也適用。如需詳細資訊,請參閱<停用索引的指導方針>。

CREATE INDEX

XML 索引

在檢視上的初始唯一叢集索引

本機暫存資料表上的索引

 

CREATE INDEX WITH DROP_EXISTING

已停用叢集索引或已停用索引檢視

本機暫存資料表上的索引

XML 索引

 

DROP INDEX

停用的索引

XML 索引

非叢集索引

本機暫存資料表上的索引

不能在單一陳述式中指定多個索引。

ALTER TABLE ADD CONSTRAINT (PRIMARY KEY 或 UNIQUE)

本機暫存資料表上的索引

叢集索引

一次僅允許一個子子句 (Subclause)。例如,您無法在同一個 ALTER TABLE 陳述式中加入和卸除 PRIMARY KEY 或 UNIQUE 條件約束。

ALTER TABLE DROP CONSTRAINT (PRIMARY KEY 或 UNIQUE)

叢集索引

 

處理線上索引作業時,不能修改、截斷或卸除基礎資料表。

當您建立或卸除叢集時,指定的線上選項設定 (ON 或 OFF) 會套用到必須重建的任何非叢集索引。例如,若是使用 CREATE INDEX WITH DROP_EXISTING, ONLINE=ON 線上建立叢集索引,那麼也會線上重建所有相關聯的非叢集索引。

線上建立或重建 UNIQUE 索引時,此索引產生器與並行使用者交易可能嘗試要插入同一個索引鍵,因此而違反了唯一性。若在原始資料列從來源資料表移動到新索引之前,將使用者輸入的資料列插入至新索引(目標),線上索引作業將失敗。

雖然這種情形並不常見,但是由於使用者或應用程序活動的原因,線上索引作業與資料庫更新互動時,即會導致死結。在這些極少數情況下,SQL Server Database Engine 將選擇使用者或應用程序活動作為死結的犧牲者。

只有在建立多個新的非叢集索引或重新組織非叢集索引時,才能在同一個資料表或檢視上執行並行線上索引 DDL 作業。同時執行的所有其他線上索引作業都會失敗。例如,在同一個資料表中線上重建現有索引時,是無法線上建立新的索引。

磁碟空間考量因素

通常,磁碟空間需求對於線上與離線作業是一樣的。例外的情形是暫存對應索引需要額外的磁碟空間。此暫存索引用於建立、重建或卸除叢集索引的線上索引作業。線上卸除叢集索引與線上建立叢集索引需要一樣多的磁碟空間。如需詳細資訊,請參閱<索引 DDL 作業的磁碟空間需求>。

效能考量

雖然線上索引作業允許並行使用者更新活動,但是若更新活動負載繁重,此索引作業將需要更長時間。一般而言,無論並行更新活動的程度,線上索引作業都將低於同等的離線索引作業。

由於線上索引作業期間都會維護來源與目標結構,因此會增加插入、更新與刪除交易時所耗用的資源,甚至可能加倍。這在索引作業期間可能導致效能降低與資源過度耗用,尤其是 CPU 時間。線上索引作業會完整記錄下來。

儘管我們推薦線上作業,但您應該評估您的環境與特定要求。離線執行索引作業可能會是最佳方式。若要達到這種方式,在作業期間,使用者僅能有限地存取資料,但是將更快完成作業且使用較少的資源。

在執行 SQL Server Enterprise 的多處理器電腦上,索引陳述式可能會如同其他查詢般,使用更多處理器來執行與索引陳述式相關聯的掃描和排序作業。您可以使用 MAXDOP 索引選項控制線上索引作業專用的處理器數目。以此方式,您就可以平衡索引作業所使用的資源以及使用者並行所使用的資源。如需詳細資訊,請參閱<設定平行索引作業>。

因為索引作業的最終階段會保留 S-lock 或 Sch-M 鎖定,所以在明確的使用者交易 (例如 BEGIN TRANSACTION...COMMIT 區塊) 內執行線上索引作業時要特別小心。這樣做導致交易完後才執行鎖定,而妨礙使用者進行並行作業。

交易記錄考量因素

大規模的索引作業,無論是離線或線上執行,都會產生大量資料負載,而很快就填滿了交易記錄。若要確定可以回復索引作業,在索引作業完成以前,不能截斷交易記錄;不過,在索引作業期間可以備份此記錄。因此,在索引作業期間,交易記錄必須有足夠的空間,才能儲存索引作業交易與任何並行使用者交易。如需詳細資訊,請參閱<索引作業的交易記錄磁碟空間>。