本文介紹了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的執行過程如下:
ePQ最佳化器以查詢解析得到的文法樹作為輸入,產生計劃樹。
ePQ執行器將計劃樹分發到各計算節點,並建立並行查詢/並行寫入進程,開始執行各自負責執行的子計劃。
並行查詢進程從儲存中並行讀取各自負責的資料分區,並將資料發送到Motion運算元。
並行寫入進程從Motion運算元中擷取資料,向儲存並行寫入資料。
參數說明
通過
polar_px_dop_per_node參數調整INSERT INTO ... SELECT ...中查詢的並行度。通過
polar_px_insert_dop_num參數調整INSERT INTO ... SELECT ...中寫入的並行度。
當查詢並行度較低時,逐步提升寫入並行度,SQL執行時間將會逐漸下降並趨於平緩,趨於平緩的原因是查詢速度跟不上寫入速度而成為瓶頸。
當查詢並行度較高時,逐步提升寫入並行度,SQL執行時間將會逐漸下降並趨於平緩;趨於平緩的原因是並行寫入只能在讀寫節點上進行,寫入速度因多個寫入進程對錶頁面擴充鎖的爭搶而跟不上查詢速度,成為瓶頸。
樣本
建立兩張表
t1和t2,並向t1中插入資料。CREATE TABLE t1 (id INT); CREATE TABLE t2 (id INT); INSERT INTO t1 SELECT generate_series(1,100000);開啟ePQ及並行
INSERT功能。SET polar_enable_px TO ON; SET polar_px_enable_insert_select TO ON;通過
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的進程。通過參數
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。