本文介紹創(chuàng)建物化視圖的跨機并行加速和批量寫入功能。

前提條件

支持的PolarDB PostgreSQL版的版本如下:
  • PostgreSQL 14(內(nèi)核小版本14.6.6.0及以上)
  • PostgreSQL 11(內(nèi)核小版本1.1.30及以上)
說明 您可通過如下語句查看PolarDB PostgreSQL版的內(nèi)核小版本的版本號:
  • PostgreSQL 14
    select version();
  • PostgreSQL 11
    show polar_version;

背景信息

物化視圖 (Materialized View)是一個包含查詢結(jié)果的數(shù)據(jù)庫對象。與普通的視圖不同,物化視圖不僅保存視圖的定義,還保存了 創(chuàng)建物化視圖時的數(shù)據(jù)副本。當(dāng)物化視圖的數(shù)據(jù)與視圖定義中的數(shù)據(jù)不一致時,可以進行 物化視圖刷新 (Refresh)保持物化視圖中的數(shù)據(jù)與視圖定義一致。物化視圖本質(zhì)上是對視圖定義中的查詢做預(yù)計算,以便于在查詢時復(fù)用。

CREATE TABLE AS 語法用于將一個查詢所對應(yīng)的數(shù)據(jù)構(gòu)建為一張新的表,其表結(jié)構(gòu)與查詢的輸出列完全相同。

SELECT INTO 語法用于建立一張新表,并將查詢所對應(yīng)的數(shù)據(jù)寫入表中,而不是將查詢到的數(shù)據(jù)返回給客戶端。其表結(jié)構(gòu)與查詢的輸出列完全相同。

原理介紹

對于物化視圖的創(chuàng)建和刷新,以及CREATE TABLE AS/SELECT INTO語法,由于在數(shù)據(jù)庫層面需要完成的工作步驟十分相似,因此PostgreSQL內(nèi)核使用同一套代碼邏輯來處理這幾種語法。內(nèi)核執(zhí)行過程中主要包含以下兩個步驟:
  1. 數(shù)據(jù)掃描:執(zhí)行視圖定義或CREATE TABLE AS/SELECT INTO語法中定義的查詢,掃描符合查詢條件的數(shù)據(jù)。
  2. 數(shù)據(jù)寫入:將上一步中掃描到的數(shù)據(jù)寫入到一個新的物化視圖或表中。
PolarDB PostgreSQL版對上述兩個步驟分別引入了ePQ并行掃描和批量數(shù)據(jù)寫入的優(yōu)化。當(dāng)需要掃描或?qū)懭氲臄?shù)據(jù)量較大時,能夠顯著提升上述DDL語法的性能,縮短執(zhí)行時間:
  • ePQ并行掃描:通過ePQ功能,利用多個計算節(jié)點的I/O帶寬和計算資源并行執(zhí)行視圖定義中的查詢,提升計算資源和帶寬的利用率。
  • 批量寫入:不再將掃描到的每一個元組依次寫入表或物化視圖,而是在內(nèi)存中攢夠一定數(shù)量的元組后,一次性批量寫入表或物化視圖中,減少記錄WAL日志的開銷,降低對頁面的鎖定頻率。

使用說明

  • ePQ并行掃描
    通過設(shè)置polar_px_enable_create_table_as參數(shù)的值,開啟或關(guān)閉ePQ并行掃描來加速CREATE TABLE AS語法中的查詢過程。取值如下:
    • ON(默認(rèn)):開啟ePQ并行掃描來加速CREATE TABLE AS語法中的查詢過程。
    • OFF:關(guān)閉ePQ并行掃描來加速CREATE TABLE AS語法中的查詢過程。
    SET polar_px_enable_create_table_as = ON;
    說明
    • 該參數(shù)生效的前提為已開啟ePQ功能(即polar_enable_px參數(shù)設(shè)置為ON)。
    • 由于ePQ功能的限制,該優(yōu)化不支持CREATE TABLE AS ... WITH OIDS語法。對于該語法的處理流程為回退使用PostgreSQL內(nèi)置優(yōu)化器為DDL定義中的查詢生成執(zhí)行計劃,并通過PostgreSQL的單機執(zhí)行器完成查詢。
  • 批量寫入
    通過設(shè)置polar_enable_create_table_as_bulk_insert參數(shù)的值,開啟或關(guān)閉批量寫入來加速SELECT INTO語法中的寫入過程。取值如下:
    • ON(默認(rèn)):開啟批量寫入來加速SELECT INTO語法中的寫入過程。
    • OFF:關(guān)閉批量寫入來加速SELECT INTO語法中的寫入過程。
    SET polar_enable_create_table_as_bulk_insert = ON;