并行INSERT
本文介紹了PolarDB PostgreSQL版的并行INSERT功能。
前提條件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 11(內(nèi)核小版本1.1.17及以上)
PostgreSQL 14(內(nèi)核小版本14.8.12.0及以上)
您可通過如下語句查看PolarDB PostgreSQL版的內(nèi)核小版本的版本號:
PostgreSQL 11
show polar_version;
PostgreSQL 14
select version();
簡介
PolarDB PostgreSQL版支持彈性跨機并行查詢(ePQ)特性,通過利用集群中多個計算節(jié)點來提升查詢性能。同時,ePQ也支持在讀寫節(jié)點上通過多進程并行寫入,實現(xiàn)對INSERT
語句的加速。
ePQ的并行INSERT
功能用于加速INSERT INTO ... SELECT ...
這種讀寫兼?zhèn)涞腟QL。對于SQL中的SELECT
部分,ePQ將啟動多個進程并行執(zhí)行查詢;對于SQL中的INSERT
部分,ePQ將在讀寫節(jié)點上啟動多個進程并行執(zhí)行寫入。執(zhí)行寫入的進程與執(zhí)行查詢的進程之間通過Motion算子進行數(shù)據(jù)傳遞。
支持并行INSERT
的表類型如下:
普通表
分區(qū)表
(部分)外部表
并行INSERT
支持動態(tài)調(diào)整寫入并行度(寫入進程數(shù)量),在查詢不成為瓶頸的條件下性能最高能提升三倍。
原理介紹
并行查詢和并行寫入以流水線的形式同時進行。執(zhí)行過程如下圖所示:ePQ 對并行INSERT
的執(zhí)行過程如下:
ePQ優(yōu)化器以查詢解析得到的語法樹作為輸入,產(chǎn)生計劃樹。
ePQ執(zhí)行器將計劃樹分發(fā)到各計算節(jié)點,并創(chuàng)建并行查詢/并行寫入進程,開始執(zhí)行各自負責執(zhí)行的子計劃。
并行查詢進程從存儲中并行讀取各自負責的數(shù)據(jù)分片,并將數(shù)據(jù)發(fā)送到Motion算子。
并行寫入進程從Motion算子中獲取數(shù)據(jù),向存儲并行寫入數(shù)據(jù)。
參數(shù)說明
通過
polar_px_dop_per_node
參數(shù)調(diào)整INSERT INTO ... SELECT ...
中查詢的并行度。通過
polar_px_insert_dop_num
參數(shù)調(diào)整INSERT INTO ... SELECT ...
中寫入的并行度。
當查詢并行度較低時,逐步提升寫入并行度,SQL執(zhí)行時間將會逐漸下降并趨于平緩,趨于平緩的原因是查詢速度跟不上寫入速度而成為瓶頸。
當查詢并行度較高時,逐步提升寫入并行度,SQL執(zhí)行時間將會逐漸下降并趨于平緩;趨于平緩的原因是并行寫入只能在讀寫節(jié)點上進行,寫入速度因多個寫入進程對表頁面擴展鎖的爭搶而跟不上查詢速度,成為瓶頸。
示例
創(chuàng)建兩張表
t1
和t2
,并向t1
中插入數(shù)據(jù)。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
表中的所有數(shù)據(jù)插入到t2
表中。查看并行INSERT
的執(zhí)行計劃。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算子將數(shù)據(jù)傳遞給3個并行寫入t2
的進程。通過參數(shù)
polar_px_insert_dop_num
動態(tài)調(diào)整寫入并行度,查看并行INSERT
的執(zhí)行計劃。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)
通過執(zhí)行計劃中的
PX Hash 6:12
顯示,并行查詢t1
的進程數(shù)量不變,并行寫入t2
的進程數(shù)量變?yōu)?code data-tag="code" class="code">12。