全部產品
Search
文件中心

PolarDB:並行INSERT

更新時間:Jul 06, 2024

本文介紹了PolarDB PostgreSQL版的並行INSERT功能。

前提條件

支援的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 11(核心小版本1.1.17及以上)

  • PostgreSQL 14(核心小版本14.8.12.0及以上)

說明

您可通過如下語句查看PolarDB PostgreSQL版的核心小版本的版本號碼:

  • PostgreSQL 11

    show polar_version;
  • PostgreSQL 14

    select version();

簡介

PolarDB PostgreSQL版支援彈性跨機並行查詢(ePQ)特性,通過利用叢集中多個計算節點來提升查詢效能。同時,ePQ也支援在讀寫節點上通過多進程並行寫入,實現對INSERT語句的加速。

ePQ的並行INSERT功能用於加速INSERT INTO ... SELECT ...這種讀寫兼備的SQL。對於SQL中的SELECT部分,ePQ將啟動多個進程並存執行查詢;對於SQL中的INSERT部分,ePQ將在讀寫節點上啟動多個進程並存執行寫入。執行寫入的進程與執行查詢的進程之間通過Motion運算元進行資料傳遞。

支援並行INSERT的表類型如下:

  • 普通表

  • 分區表

  • (部分)外部表格

並行INSERT支援動態調整寫入並行度(寫入進程數量),在查詢不成為瓶頸的條件下效能最高能提升三倍。

原理介紹

並行查詢和並行寫入以流水線的形式同時進行。執行過程如下圖所示:執行過程ePQ 對並行INSERT的執行過程如下:

  1. ePQ最佳化器以查詢解析得到的文法樹作為輸入,產生計劃樹。

  2. ePQ執行器將計劃樹分發到各計算節點,並建立並行查詢/並行寫入進程,開始執行各自負責執行的子計劃。

  3. 並行查詢進程從儲存中並行讀取各自負責的資料分區,並將資料發送到Motion運算元。

  4. 並行寫入進程從Motion運算元中擷取資料,向儲存並行寫入資料。

參數說明

  • 通過polar_px_dop_per_node參數調整INSERT INTO ... SELECT ...中查詢的並行度。

  • 通過polar_px_insert_dop_num參數調整INSERT INTO ... SELECT ...中寫入的並行度。

當查詢並行度較低時,逐步提升寫入並行度,SQL執行時間將會逐漸下降並趨於平緩,趨於平緩的原因是查詢速度跟不上寫入速度而成為瓶頸。

當查詢並行度較高時,逐步提升寫入並行度,SQL執行時間將會逐漸下降並趨於平緩;趨於平緩的原因是並行寫入只能在讀寫節點上進行,寫入速度因多個寫入進程對錶頁面擴充鎖的爭搶而跟不上查詢速度,成為瓶頸。

樣本

  1. 建立兩張表t1t2,並向t1中插入資料。

    CREATE TABLE t1 (id INT);
    CREATE TABLE t2 (id INT);
    INSERT INTO t1 SELECT generate_series(1,100000);
  2. 開啟ePQ及並行INSERT功能。

    SET polar_enable_px TO ON;
    SET polar_px_enable_insert_select TO ON;
  3. 通過INSERT語句將t1表中的所有資料插入到t2表中。查看並行INSERT的執行計畫。

    EXPLAIN INSERT INTO t2 SELECT * FROM t1;
                                           QUERY PLAN
    -----------------------------------------------------------------------------------------
     Insert on t2  (cost=0.00..952.87 rows=33334 width=4)
       ->  Result  (cost=0.00..0.00 rows=0 width=0)
             ->  PX Hash 6:3  (slice1; segments: 6)  (cost=0.00..432.04 rows=100000 width=8)
                   ->  Partial Seq Scan on t1  (cost=0.00..431.37 rows=16667 width=4)
     Optimizer: PolarDB PX Optimizer
    (5 rows)

    其中的PX Hash 6:3表示6個並行查詢t1的進程通過Motion運算元將資料傳遞給3個並行寫入t2的進程。

  4. 通過參數polar_px_insert_dop_num動態調整寫入並行度,查看並行INSERT的執行計畫。

    SET polar_px_insert_dop_num TO 12;
    EXPLAIN INSERT INTO t2 SELECT * FROM t1;
                                            QUERY PLAN
    ------------------------------------------------------------------------------------------
     Insert on t2  (cost=0.00..952.87 rows=8334 width=4)
       ->  Result  (cost=0.00..0.00 rows=0 width=0)
             ->  PX Hash 6:12  (slice1; segments: 6)  (cost=0.00..432.04 rows=100000 width=8)
                   ->  Partial Seq Scan on t1  (cost=0.00..431.37 rows=16667 width=4)
     Optimizer: PolarDB PX Optimizer
    (5 rows)

    通過執行計畫中的PX Hash 6:12顯示,並行查詢t1的進程數量不變,並行寫入t2的進程數量變為12