共用方式為


在線索引作業的運作方式

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

本文會定義在線索引作業期間存在的結構,並顯示與這些結構相關聯的活動。

在線索引結構

若要在索引數據定義語言 (DDL) 作業期間允許並行用戶活動,在線索引作業期間會使用下列結構:來源和預先存在的索引、目標,以及在線重建堆積或卸除叢集索引、暫存對應索引。

  • 來源和預先存在的索引

    來源是原始的資料表或叢集索引資料。 預先存在的索引是與來源結構相關聯的任何非叢集索引。 例如,如果在線索引作業正在重建具有四個相關聯非叢集索引的叢集索引,則來源是現有的叢集索引,且預先存在的索引是非叢集索引。

    預先存在的索引可供並行使用者使用,以進行選取、插入、更新和刪除作業。 這包括大量插入(支援但不建議在在線索引作業期間),以及觸發程式和引用完整性條件約束的隱含更新。 所有預先存在的索引都可供查詢使用。 這表示查詢優化器可能會選取它們,並在必要時在索引提示中指定。

  • Target

    目標是新的索引 (堆積) 或是一組要建立或重建的新索引。 資料庫引擎會在索引作業期間,將使用者插入、更新和刪除作業套用至來源。 例如,如果在線索引作業正在重建叢集索引,目標就是重建的叢集索引;重建叢集索引時,Database Engine 不會重建非叢集索引。

    目標索引在索引操作被認可之前不會被使用。 索引在內部是標示為唯寫。

  • 暫存對應索引

    建立、卸除或重新叢集索引的線上索引作業,也需要暫存對應索引。 並行交易會使用此暫存索引,以判斷源資料表中的資料列更新或刪除時,需在正在構建的新索引中刪除哪些記錄。 這個非叢集索引是在與新叢集索引(或堆積)相同的步驟中建立,而且不需要個別的排序作業。 並行交易會在其所有插入、更新和刪除作業中維護暫存對應索引。

在線索引活動

在在線索引作業期間,例如在非索引數據表上建立叢集索引(堆積),來源和目標會經歷三個階段:準備、建置和最終。

您可以使用 progress_report_online_index_operation 擴充事件來監視在線索引作業的進度。

下圖顯示在線上建立初始叢集索引的過程。 來源物件 (堆積) 沒有其他的索引。 每個階段都會顯示來源和目標結構活動;同時會顯示使用者 SELECTINSERTUPDATE、 和 DELETE 作業。 準備、建立和完成階段會以每個階段使用的鎖定模式一起指示。

此圖顯示在線索引作業期間執行的活動。

來源結構活動

下表列出索引作業每個階段中,與來源結構有關的活動,以及對應的鎖定策略。

Phase 源頭活動 來源鎖
Preparation

短暫階段
準備建立新的空索引結構的系統中繼資料。

定義資料表的快照集。 亦即,會使用資料列版本設定來提供交易層級的讀取一致性。

並行使用者對來源的寫入作業會短時間封鎖。

除了建立多個非叢集索引,不允許並行的 DDL 作業。
表格S 上的共享 (

意圖分享(IS)

架構修改 (Sch-M) 物件鎖定與資源子類型 INDEX_OPERATION2
Build

主階段
數據會透過批次載入操作進行掃描、排序、合併,然後插入至目標。

並行使用者 INSERTUPDATEDELETEMERGE 作業會同時套用至預先存在的索引和正在建置的任何新索引。
意圖分享(IS)

Sch-M具有資源子類型 INDEX_OPERATION2 的物件鎖定
Final

短階段
所有未提交的寫入事務都必須在此階段開始之前完成。 根據取得的鎖定,所有新的使用者讀取或寫入交易會在短暫期間被封鎖,直到此階段完成為止。

系統中繼資料會更新,以目標取代來源。

如果需要,就會卸除來源資料,例如在重建或卸除叢集索引之後。
Sch-M具有資源子類型 INDEX_OPERATION2 的物件鎖定

如果建立非叢集索引,則為數據表上的共用 (S)。1

Sch-M 如果刪除任何來源結構(索引或數據表)。1

1 索引作業會等候任何尚未提交的寫入交易完成後,來取得 SSch-M 數據表上的鎖定。 如果正在進行長時間執行的查詢,則線上索引作業會等到查詢完成為止。 除非使用低優先順序鎖定,否則這可能會形成封鎖鏈結。

2Sch-M 具有資源子類型的 INDEX_OPERATION 物件鎖定可防止在索引作業進行時,於來源和預先存在的結構上執行並行數據定義語言 (DDL) 作業。 例如,此鎖定可預防在相同資料表上同時重建兩個索引。 雖然這是 Sch-M 鎖定,但無法防止數據操作語句。

上表顯示在涉及單一索引的在線索引作業建置過程中所取得的單一共享(S)鎖定。 在單一在線索引作業中建置或重建叢集和非叢集索引時,在包含一或多個非叢集索引的數據表上建立初始叢集索引時,會在建置階段取得兩個短期 S 鎖定,後面接著長期意圖共用 (IS) 鎖定。 先取得一個 S 鎖定,以便建立叢集索引。 建立叢集索引時,會取得第二個短期 S 鎖定來建立非叢集索引。 建立非叢集索引之後,S 鎖定會被降級為 IS 鎖定,並維持此狀態直到線上索引操作的最後一階段。

如需如何使用鎖定以及如何管理鎖定的詳細資訊,請參閱 使用在線索引作業WAIT_AT_LOW_PRIORITY

目標結構相關活動

下表列出索引作業每個階段中,與目標結構有關的活動,以及對應的鎖定策略。

Phase 目標活動 目標鎖定
Preparation 已建立新索引,並且設為唯寫。 意圖分享(IS)
Build 從來源插入資料。

針對來源進行的使用者修改(插入、更新、刪除)也會應用到目標。

此活動對使用者而言不需要做任何變更。
意圖分享(IS)
Final 更新索引中繼資料。

索引會設定為讀取/寫入狀態。
共用 (S) 或架構修改 (Sch-M

在索引作業完成之前,用戶查詢不會存取目標。

準備或最終階段完成後,儲存在計劃快取中的查詢計劃可能會失效。

與線上索引作業有關的資料表,其宣告的資料指標存留時間會受到線上索引階段的限制。 在每一個階段中,更新資料指標都是無效的。 而只有在完成階段之後,唯讀資料指標才會無效。