PolarDB PostgreSQL版叢集提供大量匯入基礎設施。
適用範圍
支援的PolarDB PostgreSQL版的版本如下:
PostgreSQL 18(核心小版本2.0.18.0.1.0及以上)
PostgreSQL 17(核心小版本2.0.17.2.1.0及以上)
PostgreSQL 16(核心小版本2.0.16.6.2.0及以上)
PostgreSQL 15(核心小版本2.0.15.12.4.0及以上)
PostgreSQL 14(核心小版本2.0.14.13.28.0及以上)
您可在控制台查看核心小版本號碼,也可以通過
SHOW polardb_version;語句查看。如未滿足核心小版本要求,對於不同資料庫引擎您可使用以下解決方案:
PostgreSQL 15及以上:請升級核心小版本。
PostgreSQL 14及以下:請使用建立/重新整理物化視圖實現批量寫入。
背景
在當前事務未提交階段對建立對象進行批量資料匯入時,由於事務隔離性,該對象對其他進程不可見。基於PolarDB PostgreSQL版的系統特性,可在此前提下針對性實現批量資料匯入各層次上最佳化。
PolarDB PostgreSQL版對於僅當前進程內可見的對象,提供了通用的大量匯入基礎設施,通過繞開緩衝區管理、批量構造頁面、批量擴充儲存頁面、批量記錄WAL日誌、同步路徑非同步化等手段,極大提升大量匯入的效能。
使用說明
目前使用該基礎設施的文法包含:
CREATE INDEXREINDEXVACUUM FULLALTER TABLE SET TABLESPACECREATE MATERIALIZED VIEWREFRESH MATERIALIZED VIEW- 說明
CREATE TABLE AS/SELECT INTO文法使用大量匯入基礎設施與
wal_level參數值有關,當該參數值低於logical時預設使用以上大量匯入,當該值為logical時,以上文法預設使用Multi-Insert Table AM基礎設施的批量插入介面。
原理介紹
繞開緩衝區管理
由於匯入的資料在事務提交前無需對其它進程可見,因此在頁面構造階段可以直接利用進程私人記憶體進行處理,而無需通過共用記憶體Buffer Pool分配頁面。繞開緩衝區管理可以有效規避鎖資源競爭,顯著提升構造頁面效率。
批量擴充頁面
原有的大量匯入機制通常採用逐頁寫入模式,即每當頁面寫滿時便通過儲存管理層介面進行單頁擴充。由於雲端儲存的高延遲特性,此類逐頁擴充操作將導致主路徑產生顯著I/O等待開銷。PolarDB PostgreSQL版在進程的私人記憶體中預彙總多個頁面資料,待累積達到閾值後通過儲存管理層介面進行頁面批量擴充,有效分攤單頁擴充的延時。
批量記錄WAL日誌
原有大量匯入機制中,無論是堆表還是索引的匯入操作,通常採用逐行記錄模式,即為每行資料產生獨立的WAL日誌條目。由於進程在私人記憶體中構建頁面時會將多行資料集中寫入單個頁面,並在私人記憶體中預彙總多個待持久化頁面。因此,PolarDB PostgreSQL版採用XLOG_FPI類型的WAL日誌,在這批頁面構造完成後批量記錄。該類型WAL日誌直接記錄整個頁面資料,而非頁面上的增量修改,相較傳統逐行記錄方式更加緊湊,有效節省WAL日誌中繼資料的開銷。
主路徑非同步化
當前事務提交後,在私人記憶體中構造的頁面需對其它進程可見。因此,理論上在事務提交之前需確保所有構造完畢的頁面已經完成持久化儲存,但是這將顯著增加主路徑的延遲。對此PolarDB PostgreSQL版在完成批量頁面構造後,立即將頁面拷貝至Buffer Pool中並標記為髒頁,即可完成提交返回。通過後台並行刷髒進程,非同步執行頁面寫回操作,充分發揮PolarDB高吞吐刷髒能力優勢,實現頁面構造和後台刷髒的平行處理。
同時,該機制在系統崩潰情境下仍能保障資料一致性。由於已提前記錄FPI類型的WAL日誌,可保證已提交資料的恢複。
使用方法
參數polar_bulk_write_maxpages用於控制進程私人記憶體中預彙總最大頁面數量。當預彙總頁面數量達到該值後,將觸發批量頁面擴充和批量WAL日誌記錄,並拷貝頁面到Buffer Pool中待刷髒。其預設值已為最優值,通常無需關注。
SHOW polar_bulk_write_maxpages;
polar_bulk_write_maxpages
---------------------------
1MB
(1 row)