PolarDB PostgreSQL版集群支持創建/刷新物化視圖的批量寫入。
前提條件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(內核小版本14.9.15.0及以上)
您可通過如下語句查看PolarDB PostgreSQL版的內核小版本的版本號:
PostgreSQL 14
select version();
背景信息
物化視圖 (Materialized View)是一個包含查詢結果的數據庫對象。與普通的視圖不同,物化視圖不僅保存視圖的定義,還保存了創建物化視圖時的數據副本。當物化視圖的數據與視圖定義中的數據不一致時,可以進行物化視圖刷新 (Refresh)保持物化視圖中的數據與視圖定義一致。物化視圖本質上是對視圖定義中的查詢做預計算,以便于在查詢時復用。
CREATE TABLE AS語法用于將一個查詢所對應的數據構建為一張新的表,其表結構與查詢的輸出列完全相同。
SELECT INTO語法用于建立一張新表,并將查詢所對應的數據寫入表中,而不是將查詢到的數據返回給客戶端。其表結構與查詢的輸出列完全相同。
原理介紹
對于物化視圖的創建(CREATE MATERIALIZED VIEW
)和刷新(REFRESH MATERIALIZED VIEW
),以及CREATE TABLE AS
/SELECT INTO
語法,由于在數據庫層面需要完成的工作步驟十分相似,因此PostgreSQL內核使用同一套代碼邏輯來處理這幾種語法。內核執行過程中主要包含以下兩個步驟:
數據掃描:執行視圖定義或
CREATE TABLE AS
/SELECT INTO
語法中定義的查詢,掃描符合查詢條件的數據。數據寫入:將上一步中掃描到的數據寫入到一個新的物化視圖或表中。
PolarDB PostgreSQL版對數據寫入步驟引入了批量寫入的優化。當需要寫入的數據量較大時,不再每次掃描一個元組就立刻寫入表或物化視圖中,而是在內存中攢夠一定數量的元組后,一次性批量寫入表或物化視圖中,從而能夠減少記錄WAL日志和查詢頁面空閑空間映射的開銷,降低對頁面的鎖定頻率,顯著縮短上述DDL的執行時間。
使用說明
將參數polar_enable_create_table_as_bulk_insert
設置為ON
即可啟用該功能,默認值為ON
。
SET polar_enable_create_table_as_bulk_insert TO ON;