PolarDB PostgreSQL版的彈性跨機并行查詢(ePQ)支持并行寫入及查詢OSS外部表。
前提條件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(內核小版本14.9.13.0及以上)
PostgreSQL 11(內核小版本1.1.35及以上)
您可通過如下語句查看PolarDB PostgreSQL版的內核小版本的版本號:
PostgreSQL 14
select version();
PostgreSQL 11
show polar_version;
背景信息
PolarDB PostgreSQL版支持通過oss_fdw插件創建OSS外部表,其物理存儲位于阿里云對象存儲OSS上,在數據庫內僅保存表的元信息。數據庫中不常使用的歷史數據、冷數據可以以外部表的形式歸檔到OSS上,從而節省數據庫的存儲成本。PolarDB PostgreSQL版的FDW接口標準保證了OSS外部表依舊支持通過標準SQL進行受限的讀寫訪問。
將本地表的數據通過寫入OSS外部表創建歸檔時,PolarDB PostgreSQL版默認將啟動一個進程寫入OSS外部表,其本質上是單進程上傳的網絡訪問模式。在歸檔數據量非常大的場景中,單進程寫入OSS外部表無法有效利用OSS的網絡高帶寬,導致非常低效。
在查詢OSS外部表中的歷史歸檔數據時,PolarDB PostgreSQL版默認將啟動一個進程查詢OSS外表對應的全量數據,其本質上也是單進程下載的網絡訪問模式。當歸檔數據量非常大時,單進程查詢OSS外部表無法有效利用OSS的網絡高帶寬,也相對低效。
PolarDB PostgreSQL版的彈性跨機并行查詢(ePQ)支持并行寫入及查詢OSS外部表:
ePQ優化器能夠產生多進程并行寫入OSS外部表的執行計劃,ePQ執行器將在讀寫節點上啟動多個進程并行寫入OSS外部表。
ePQ優化器能夠產生多進程并行查詢OSS外部表的執行計劃,ePQ執行器將在多個計算節點上啟動多個進程并行查詢OSS外部表。
ePQ對OSS外部表的并行化讀寫訪問能力將數據庫對OSS的網絡訪問模式從單進程上傳/下載模式優化為多進程上傳/下載模式,從而能夠充分利用OSS的網絡帶寬資源,提升冷數據歸檔和冷數據查詢的性能。
使用指南
準備數據
創建一張本地表
t_local
,并插入一定規模的數據。CREATE TABLE t_local (id INT, age INT, msg TEXT, detail TEXT); INSERT INTO t_local SELECT random() * 1000000, random() * 10000, md5(random()::TEXT), md5(random()::TEXT) FROM generate_series(1, 2000000);
創建一張與本地表
t_local
結構相同的OSS外部表t_oss
。CREATE EXTENSION oss_fdw; CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS (host 'oss-cn-xxx.aliyuncs.com', bucket 'mybucket', id 'xxx', key 'xxx'); CREATE FOREIGN TABLE t_oss (id INT, age INT, msg TEXT, detail TEXT) SERVER ossserver OPTIONS (dir 'archive/');
并行寫入OSS外部表
執行以下命令,禁用ePQ。
SET polar_enable_px TO OFF;
執行以下命令,將本地表
t_local
中的數據導入到OSS外部表t_oss
中。執行計劃與時間如下。EXPLAIN (COSTS OFF) INSERT INTO t_oss SELECT * FROM t_local; QUERY PLAN --------------------------- Insert on t_oss -> Seq Scan on t_local (2 rows) INSERT INTO t_oss SELECT * FROM t_local; INSERT 0 2000000 Time: 8861.708 ms (00:08.862)
根據上述執行計劃顯示,執行器將啟動一個進程來掃描本地表并同時寫入OSS外部表。總計用時為8861.708ms。
執行以下命令,啟用ePQ以及ePQ并行
INSERT
功能,設置并行查詢本地表的并行度為16,設置并行寫入OSS外部表的并行度為16。SET polar_enable_px TO ON; SET polar_px_enable_insert_select TO ON; SET polar_px_dop_per_node TO 16; SET polar_px_insert_dop_num TO 16;
再次執行以下命令,執行計劃與時間如下。
EXPLAIN (COSTS OFF) INSERT INTO t_oss SELECT * FROM t_local; QUERY PLAN --------------------------------------------------- Insert on t_oss -> Result -> PX Hash 32:16 (slice1; segments: 32) -> Partial Seq Scan on t_local Optimizer: PolarDB PX Optimizer (5 rows) INSERT INTO t_oss SELECT * FROM t_local; INSERT 0 2000000 Time: 1321.212 ms (00:01.321)
根據上述執行計劃顯示,ePQ執行框架將會啟動32個進程(
segments: 32
)執行計劃分片slice1
,并行掃描本地表(Partial Seq Scan
);然后通過Motion算子將數據重分布(PX Hash 32:16
)到并行寫入OSS外部表的16個進程中。總計用時為1321.212ms,較單進程寫入有了明顯的提升。
并行查詢OSS外部表
執行以下命令,禁用ePQ。
SET polar_enable_px TO OFF;
執行以下命令,查詢OSS外部表
t_oss
的全量數據行數。執行計劃與結果如下。EXPLAIN SELECT COUNT(*) FROM t_oss; QUERY PLAN ------------------------------------------------------------------------------- Aggregate (cost=1366687.96..1366687.97 rows=1 width=8) -> Foreign Scan on t_oss (cost=0.00..1334280.40 rows=12963024 width=0) Directory on OSS: archive/ Number Of OSS file: 17 Total size of OSS file: 297 MB (5 rows) SELECT COUNT(*) FROM t_oss; count --------- 4000000 (1 row) Time: 36230.325 ms (00:36.230)
根據上述執行計劃顯示,執行器將啟動一個進程來掃描OSS外部表對應的17個OSS文件,總計297 MB,用時為36230.325ms。
執行以下命令,啟用ePQ并設置查詢并行度為8。
SET polar_enable_px TO ON; SET polar_px_dop_per_node TO 8;
再次執行以下命令,執行計劃與結果如下。
EXPLAIN SELECT COUNT(*) FROM t_oss; QUERY PLAN --------------------------------------------------------------------------------------- Aggregate (cost=0.00..431.00 rows=1 width=8) -> PX Coordinator 16:1 (slice1; segments: 16) (cost=0.00..431.00 rows=1 width=1) -> Partial Foreign Scan on t_oss (cost=0.00..431.00 rows=1 width=1) Directory on OSS: archive/ Number Of OSS file: 17 Total size of OSS file: 297 MB Optimizer: PolarDB PX Optimizer (7 rows) SELECT COUNT(*) FROM t_oss; count --------- 4000000 (1 row) Time: 18100.894 ms (00:18.101)
根據上述執行計劃顯示,ePQ執行框架將在兩個計算節點上總共啟動16個進程(
segments: 16
)執行計劃分片slice1
,并行掃描OSS外部表(Partial Foreign Scan
)。這16個進程將會以OSS上的文件為粒度,各自對查詢任務進行分工。所有進程的查詢結果將會通過Motion算子(PX Coordinator 16:1
)匯聚到查詢發起進程并返回。總計用時為18100.894ms,較單進程查詢有了明顯的提升。