本主題會定義在線索引作業期間存在的結構,並顯示與這些結構相關聯的活動。
在線索引結構
若要在索引數據定義語言 (DDL) 作業期間允許並行用戶活動,在線索引作業期間會使用下列結構:來源和預先存在的索引、目標,以及在線重建堆積或卸除叢集索引、暫存對應索引。
來源和預先存在的索引
來源是原始數據表或叢集索引數據。 預先存在的索引是與來源結構相關聯的任何非叢集索引。 例如,如果在線索引作業正在重建具有四個相關聯非叢集索引的叢集索引,則來源是現有的叢集索引,且預先存在的索引是非叢集索引。
預先存在的索引可供並行使用者使用,以進行選取、插入、更新和刪除作業。 這包括大量插入(支援但不建議),以及觸發程式和引用完整性條件約束的隱含更新。 所有預先存在的索引都可供查詢和搜尋使用。 這表示查詢優化器可能會選取它們,並在必要時在索引提示中指定。
目標
目標或多個目標是新的索引(或堆疊)或一組要建立或重建的新索引。 SQL Server 資料庫引擎會在索引作業期間,將使用者插入、更新和刪除作業套用至來源。 例如,如果在線索引作業正在重建叢集索引,目標就是重建的叢集索引;重建叢集索引時,Database Engine 不會重建非叢集索引。
在索引作業認可前,處理 SELECT 語句時不會搜尋目標索引。 在內部,索引會標示為僅限寫入。
暫時映射索引
建立、卸除或重建叢集索引的在線索引作業也需要暫存對應索引。 並行交易使用此暫存索引來確定在基礎表中的行更新或刪除時,正在建立的新索引裡應刪除哪些記錄。 這個非叢集索引是在與新叢集索引(或堆積)相同的步驟中建立,而且不需要個別的排序作業。 並行交易在所有插入、更新和刪除操作中,也會維護臨時映射索引。
在線索引活動
在簡單的在線索引作業中,例如在非索引數據表上建立叢集索引(堆積),來源和目標會經歷三個階段:準備、建置和最終。
下圖顯示在線建立初始叢集索引的程式。 來源物件 (堆積) 沒有其他索引。 每個階段都會顯示來源和目標結構活動;同時會顯示並行用戶選取、插入、更新和刪除作業。 準備、建置和最終階段會與每個階段中使用的鎖定模式一起表示。
在
來源架構活動
下表列出在索引作業的每個階段和對應的鎖定策略期間,涉及來源結構的活動。
| 階段 | 來源活動 | 來源鎖定 |
|---|---|---|
| 準備 非常短的階段 |
建立新的空白索引結構的系統元數據準備。 已定義數據表的快照。 也就是說,數據列版本設定是用來提供交易層級讀取一致性。 在來源上,並行使用者寫入作業會被封鎖於非常短暫的時間。 除了建立多個非叢集索引之外,不允許並行 DDL 作業。 |
資料表上的 S (共用) * IS (意圖分享) INDEX_BUILD_INTERNAL_RESOURCE** |
| 建造 主要階段 |
資料會在大量載入作業中掃描、排序、合併及插入至目標中。 並行使用者選取、插入、更新和刪除作業會同時套用至預先存在的索引和正在建置的任何新索引。 |
伊斯蘭國 索引建立内部资源 |
| 最終 短暫階段 |
所有未認可的更新交易都必須在此階段開始之前完成。 依據取得的鎖定,所有新的使用者讀取或寫入交易會在此階段完成前被暫時封鎖。 系統會更新元數據,以將現有來源替換為目標。 如果有需要,來源會被移除。 例如,在重建或移除叢集索引之後。 |
INDEX_BUILD_INTERNAL_RESOURCE(索引構建內部資源) 如建立非叢集索引時,請在資料表上標註「S」。 SCH-M(架構修改)如果移除任何原始結構(索引或數據表)。 |
* 索引作業會等候任何尚未提交的更新交易完成,再取得數據表上的"S"鎖定或"SCH-M"鎖定。
** 資源鎖定INDEX_BUILD_INTERNAL_RESOURCE會在索引作業進行時,防止在來源和預先存在結構上執行並行數據定義語言 (DDL) 作業。 例如,此鎖定可防止在相同數據表上同時重建兩個索引。 雖然此資源鎖定與 Sch-M 鎖定相關聯,但不會防止數據操作語句。
上表顯示在在線索引作業的建置階段取得的單一共享鎖定,其中包含單一索引。 在單一在線索引作業中建置或重建叢集和非叢集索引時,在包含一或多個非叢集索引的數據表上建立初始叢集索引時,會在建置階段取得兩個短期 S 鎖定,後面接著長期意圖共用 (IS) 鎖定。 先取得一個 S 鎖定來建立叢集索引,而建立叢集索引完成時,會取得第二個短期 S 鎖定來建立非叢集索引。 建立非叢集索引之後,S 鎖定會降級為IS鎖定,直到在線索引作業的最後階段為止。
目標架構活動
下表列出在索引作業的每個階段和對應的鎖定策略期間,涉及目標結構的活動。
| 階段 | 目標活動 | 目標鎖定 |
|---|---|---|
| 準備 | 系統會建立新的索引,並設定為僅限寫入。 | 伊斯蘭國 |
| 建造 | 數據會從來源插入。 套用至來源的使用者修改(插入、更新、刪除)。 此活動對使用者而言是透明的。 |
伊斯蘭國 |
| 最終 | 索引元數據已更新。 索引被設置為讀取/寫入狀態。 |
S 或 SCH-M |
在索引作業完成之前,用戶發出的 SELECT 語句不會存取目標。
完成準備和最後階段之後,程式快取中儲存的查詢和更新計劃會失效。 後續查詢將會使用新的索引。
在參與在線索引操作的數據表上宣告的游標,其存留期受限於在線索引操作的各個階段。 每個階段的更新游標都會無效。 僅在最終階段後,唯讀游標才會失效。