我想了解PostgreSQL如何在沒有寫入鎖的情況下構建索引concurrently。Postgresql併發索引
有人可以描述PostgreSQL執行的步驟,以便在連續寫入表數據的同時執行此操作嗎?
我想了解PostgreSQL如何在沒有寫入鎖的情況下構建索引concurrently。Postgresql併發索引
有人可以描述PostgreSQL執行的步驟,以便在連續寫入表數據的同時執行此操作嗎?
相關細節在源代碼註釋中。見the comments on validate_index
in src/backend/catalog/index.c
around line 2607:
我們首先將通過index_create索引的目錄條目 (),這標誌着它不是indisready而不是 indisvalid做並行索引構建。然後我們提交我們的交易並開始一個新的交易,然後我們等待所有可能已經修改表 終止的交易。
....和很多很多。基本上「很複雜」。我會嘗試解釋它,但是我沒有詳細閱讀代碼,也不知道代碼庫的這一部分,因此唯一的解釋是的解釋是註釋和源代碼。
我的理解是,它基於表狀態的MVCC快照進行初始構建,在完成時提交。然後等待,直到所有的事務都能看到(破壞的)索引,在這個時候,當它們在表格中改變時,它們將全部更新它。然後,它將構建索引時看到的內容與現在可見的內容進行比較,並更新索引以反映快照之間的差異。然後它會等待確保沒有任何事務可以在索引處於無效狀態時看到該索引,並將索引標記爲有效,然後再次提交。
整個過程在很大程度上依賴於MVCC快照和可視性。這也是顯着在I/O,CPU和RAM方面比普通索引版本更昂貴。
validate_index
由DefineIndex
in src/backend/commands/indexcmds.c調用,其中包含有關整個過程的詳細信息。