線上索引作業的指導方針
適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
當您執行線上索引作業時,下列指導方針將適用:
- 當基礎資料表包含下列大型物件 (LOB) 資料類型時,必須離線建立、重建或卸除叢集索引: image、 ntext和 text。
- 當數據表具有使用 LOB 數據類型的數據行,但索引定義中沒有任何數據行作為索引鍵或包含的數據行時,就可以在在線建立非叢集索引。
- 您無法在線上建立、重建或卸除本機暫存資料表上的索引。 此限制不適用於全域暫存資料表上的索引。
- 您可以使用 CREATE INDEX 的
RESUMABLE
子句,或 ALTER INDEX,啟動線上索引作業作為可恢復作業。 可恢復的索引作業可以在非預期的失敗、資料庫切換或ALTER INDEX PAUSE
命令後重新啟動,並從中斷處繼續。
注意
並非所有 Microsoft SQL Server 版本都提供線上編製索引作業。 如需 SQL Server 版本支援的功能清單,請參閱 SQL Server 2022 的版本和支援功能。
下表顯示可在線上執行的索引作業、從這些線上作業排除的索引,以及可繼續的索引限制。 也包含其他限制。
線上索引作業 | 排除索引 | 其他限制 |
---|---|---|
ALTER INDEX REBUILD |
已停用叢集索引或已停用索引檢視 XML 索引 本機暫存資料表上的索引 |
當資料表包含排除索引時,指定關鍵字 ALL 可能導致作業失敗。重建已停用索引的其他限制也適用。 如需詳細資訊,請參閱 停用索引和條件約束。 |
CREATE INDEX |
XML 索引 在檢視上的初始唯一叢集索引 本機暫存資料表上的索引 |
|
CREATE INDEX WITH DROP_EXISTING |
已停用叢集索引或已停用索引檢視 本機暫存資料表上的索引 XML 索引 |
|
DROP INDEX |
停用的索引 XML 索引 非叢集索引 本機暫存資料表上的索引 |
不能在單一陳述式中指定多個索引。 |
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY 或 UNIQUE ) |
本機暫存資料表上的索引 叢集索引 |
一次僅允許一個子句。 例如,無法在同一個 PRIMARY KEY 陳述式中新增和卸除 UNIQUE 或 ALTER TABLE 限制。 |
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY 或 UNIQUE ) |
叢集索引 |
在在線索引作業進行時,無法修改、截斷或卸除基礎表。
當您建立或卸除叢集時,指定的線上選項設定 (ON
或 OFF
) 會套用到必須重建的任何非叢集索引。 例如,如果使用 CREATE INDEX WITH DROP_EXISTING, ONLINE=ON
在在線建置叢集索引,則所有相關聯的非叢集索引也會在在線重新建立。
線上建立或重建 UNIQUE
索引時,此索引產生器與並行使用者交易可能嘗試要插入同一個索引鍵,因此而違反了唯一性。 若在原始資料列從來源資料表移動到新索引之前,將使用者輸入的資料列插入至新索引 (目標),線上索引作業將失敗。
雖然這種情形並不常見,但是由於使用者或應用程序活動的原因,線上索引作業與資料庫更新互動時,即會導致死結。 在這些罕見的情況下,使用者或應用程式活動會被選為死結的受害者。
只有在建立多個新的非叢集索引或重新組織非叢集索引時,才能在同一個資料表或檢視上執行並行線上索引 DDL 作業。 同時執行的所有其他線上索引作業都會失敗。 例如,在同一個資料表中線上重建現有索引時,是無法線上建立新的索引。
當索引包含大型物件類型的數據行時,無法執行在線作業,而且相同的交易會在在線索引作業開始之前進行數據修改。 若要解決此問題,請將在線索引作業移至交易外部,或在相同交易中的任何數據修改之前移動它。
磁碟空間考量因素
在線索引作業需要比離線索引作業更多的磁碟空間。
- 在索引建立和索引重建作業期間,所建置 (或重建) 的索引都需要額外的空間。 通常,這個額外的空間與索引所佔用的目前空間相同,但視目前或重建索引中使用的壓縮而定,它可能會更大或更小。
- 此外,暫存對應索引需要占用磁碟空間。 此暫存索引用於建立、重建或卸除叢集索引的線上索引作業。
- 線上卸除叢集索引與線上建立 (或重建) 叢集索引需要一樣多的磁碟空間。
如需詳細資訊,請參閱 索引 DDL 作業的磁碟空間需求。
效能考量
雖然在線索引作業允許並行使用者更新活動,但如果更新活動繁重,索引作業可能需要更長的時間。 一般而言,無論並行更新活動的程度如何,線上索引操作都會低於同等的離線索引操作。
因為來源和目標結構都會在在線索引作業期間維護,因此插入、更新和刪除交易的資源使用量會增加,可能會增加一倍。 這在索引作業期間可能導致效能降低與資源過度耗用,尤其是 CPU 時間。 線上索引作業會完整記錄下來。
儘管我們推薦線上作業,但您應該評估您的環境與特定要求。 離線執行索引操作可能會是最佳方式。 因此,在操作期間會限制使用者對資料的存取,但是操作會完成地更快且使用的資源更少。
在執行 SQL Server 2016 (13.x) 和更新版本的多處理器電腦上,索引作業可以使用平行處理原則來執行與索引語句相關聯的掃描和排序作業。 您可以使用 [MAXDOP
索引] 選項來控制在線索引作業平行處理原則的程度。 以此方式,您就可以平衡索引操作所使用的資源以及使用者並行所使用的資源。 如需詳細資訊,請參閱 設定平行索引作業。 如需有關支援平行索引操作之 SQL Server 版本的詳細資訊,請參閱 SQL Server 2022 的版本和支援的功能。
由於在索引作業的最後階段會保留共用(S
)鎖定或架構修改(Sch-M
)鎖定,因此當您在明確的使用者交易(例如 BEGIN TRANSACTION ... COMMIT
區塊)內執行線上索引操作時,請務必小心。 這樣做會導致鎖定會持續直到交易結束為止,可能會阻塞其他工作負載。
如果使用 ALLOW_PAGE_LOCKS=OFF
停用索引頁鎖定,當 MAXDOP
大於 1 時,在線索引重建可能會增加索引的碎片化。 如需詳細資訊,請參閱 運作方式:線上索引重建 - 可能會導致片段增加。
交易記錄考量因素
離線或線上執行的大規模索引作業可能會產生大量的事務歷史記錄。 這是因為離線和線上索引重建作業都會完整記錄。 為了確保索引作業可以回復,在索引作業完成之前,交易記錄檔不得遭到截斷;不過,在索引作業期間可以備份記錄檔。
因此,在索引操作期間,交易記錄必須有足夠的空間,才能儲存索引作業交易與任何並行使用者交易。 如需詳細資訊,請參閱 索引作業的交易記錄磁碟空間。
如果啟用了 提速資料庫復原(ADR),在線索引操作就不會造成交易日志的大量增長。
持續性版本存放區考量因素
如果已啟用 ADR,線上建立或重建大型索引可能會在索引作業進行時大幅增加持續版本存放區(PVS)的大小。 請確定資料庫有足夠的可用空間讓 PVS 成長。 如需詳細資訊,請參閱 監視和疑難解答加速資料庫復原。
可恢復的索引考慮因素
CREATE INDEX
和 ALTER INDEX
的 RESUMABLE
索引選項適用於 SQL Server (ALTER INDEX
從 SQL Server 2017 (14.x) 開始,以及從 SQL Server 2019 (15.x)開始的 CREATE INDEX
、Azure SQL Database 和 Azure SQL 受控實例。 如需詳細資訊,請參閱 CREATE INDEX 和 ALTER INDEX。
若要使用 RESUMABLE
選項,您也必須使用 ONLINE
選項。 當您執行可繼續的索引建立或重建時,適用下列指導方針:
- 您可以更妥善地控制管理、規劃和擴充索引維護窗口。 您可以多次暫停並重新啟動索引建立或重建作業,以配合您的維護時段。
- 您可以從索引建立或重建失敗中復原(例如資料庫故障轉移或磁碟空間不足),而不需要從頭重新啟動索引作業。
- 當索引作業暫停時,原始索引和新建立的索引都需要磁碟空間,而且必須在 DML 作業期間進行更新。
- 不支援
SORT_IN_TEMPDB=ON
選項。 - 不支援停用的索引。
提示
可續的索引作業不需要大規模交易,因此允許在此作業期間經常截斷日誌,並避免大型日誌成長。 繼續和完成索引作業所需的數據會儲存在資料庫的數據檔中。
一般而言,可繼續與不可繼續的在線索引作業之間沒有效能差異。 對於支援繼續的 CREATE INDEX
,固定的額外負擔可能會導致較小型數據表的操作明顯變慢。
當可繼續的索引作業暫停時:
- 對於大部分讀取工作負載而言,效能降低並不重要。
- 針對更新頻繁的工作負載,您可能會視具體工作負載情況遇到一些吞吐量降低的情況。
一般而言,可繼續和不可繼續的線上索引建立或重建之間的磁碟重組品質沒有差異。
注意
當線上索引作業暫停時,任何需要在含有該暫停索引的資料表上取得表層級獨佔(X
)鎖定的交易都會失敗。 例如,這可能會與 INSERT ... WITH (TABLOCK)
操作一起發生。 在此情況下,您會收到錯誤 10637:
Cannot perform this operation on '<object name>' with ID (<object ID>) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.
若要解決錯誤 10637,請從交易中移除 TABLOCK
提示,或取消暫停索引操作,並等候它完成,然後再嘗試交易。
線上預設選項
您可以藉由設定 ELEVATE_ONLINE
或 ELEVATE_RESUMABLE
資料庫範圍設定,將在線和可繼續的索引作業設定為資料庫層級的預設選項。 使用這些預設選項,您可以避免意外啟動離線索引作業,讓數據表或索引在執行時無法存取。 這兩個選項都會導致資料庫引擎自動將特定索引作業提升至在線或可繼續執行。
您可以將任一選項設定為 FAIL_UNSUPPORTED
、WHEN_SUPPORTED
或 OFF
。 您可以為 ELEVATE_ONLINE
和 ELEVATE_RESUMABLE
設定不同的值。 如需詳細資訊,請參閱 ALTER DATABASE SCOPED CONFIGURATION。
ELEVATE_ONLINE
和 ELEVATE_RESUMABLE
僅適用於分別支援線上和可繼續語法的 DDL 陳述式。 例如,如果您嘗試使用 ELEVATE_ONLINE=FAIL_UNSUPPORTED
建立 XML 索引,則作業會離線執行,因為 XML 索引不支援 ONLINE
選項。 選項只會影響未指定 ONLINE
或 RESUMABLE
選項而提交的 DDL 語句。 例如,透過使用 ONLINE=OFF
或 RESUMABLE=OFF
來提交陳述式,使用者可以覆寫 FAIL_UNSUPPORTED
設定,並離線及/或以不可繼續的方式執行陳述式。
注意
ELEVATE_ONLINE
和 ELEVATE_RESUMABLE
不適用於 XML 索引操作。