本文介紹建立物化視圖的跨機並行加速和批量寫入功能。
適用範圍
支援的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(核心小版本2.0.14.6.6.0及以上)
PostgreSQL 11(核心小版本2.0.11.9.30.0及以上)
背景資訊
物化視圖 (Materialized View)是一個包含查詢結果的資料庫物件。與普通的視圖不同,物化視圖不僅儲存視圖的定義,還儲存了建立物化視圖時的資料副本。當物化視圖的資料與視圖定義中的資料不一致時,可以進行物化視圖重新整理 (Refresh)保持物化視圖中的資料與視圖定義一致。物化視圖本質上是對視圖定義中的查詢做預計算,以便於在查詢時複用。
CREATE TABLE AS文法:用於將一個查詢所對應的資料構建為一張新的表,其表結構與查詢的輸出資料行完全相同。
SELECT INTO文法:用於建立一張新表,並將查詢所對應的資料寫入表中,而不是將查詢到的資料返回給用戶端。其表結構與查詢的輸出資料行完全相同。
原理介紹
對於物化視圖的建立和重新整理,以及CREATE TABLE AS/SELECT INTO文法,由於在資料庫層面需要完成的工作步驟十分相似,因此PostgreSQL核心使用同一套代碼邏輯來處理這幾種文法。核心執行過程中主要包含以下兩個步驟:
資料掃描:執行視圖定義或
CREATE TABLE AS/SELECT INTO文法中定義的查詢,掃描符合查詢條件的資料。資料寫入:將上一步中掃描到的資料寫入到一個新的物化視圖或表中。
PolarDB PostgreSQL版對上述兩個步驟分別引入了ePQ並行掃描和批量資料寫入的最佳化。當需要掃描或寫入的資料量較大時,能夠顯著提升上述DDL文法的效能,縮短執行時間:
ePQ並行掃描:通過ePQ功能,利用多個計算節點的I/O頻寬和計算資源並存執行視圖定義中的查詢,提升計算資源和頻寬的利用率。
批量寫入:不再將掃描到的每一個元組依次寫入表或物化視圖,而是在記憶體中攢夠一定數量的元組後,一次性批量寫入表或物化視圖中,減少記錄WAL日誌的開銷,降低對頁面的鎖定頻率。
使用說明
通過設定polar_px_enable_create_table_as參數的值,開啟或關閉ePQ並行掃描來加速CREATE TABLE AS文法中的查詢過程。取值如下:
ON(預設):開啟ePQ並行掃描來加速
CREATE TABLE AS文法中的查詢過程。OFF:關閉ePQ並行掃描來加速
CREATE TABLE AS文法中的查詢過程。
SET polar_px_enable_create_table_as = ON;該參數生效的前提為已開啟ePQ功能(即
polar_enable_px參數設定為ON)。由於ePQ功能的限制,該最佳化不支援
CREATE TABLE AS ... WITH OIDS文法。對於該文法的處理流程為回退使用PostgreSQL內建最佳化器為DDL定義中的查詢產生執行計畫,並通過PostgreSQL的單機執行器完成查詢。