并行查詢
PolarDB PostgreSQL版(兼容Oracle)支持分區(qū)表的并行查詢(Parallel Append)功能,可以更好地處理大規(guī)模數(shù)據(jù)的查詢。
概述
當(dāng)代計算機往往有更多的核心可以使用,并行查詢是現(xiàn)代數(shù)據(jù)庫必不可少的能力。PolarDB PostgreSQL版(兼容Oracle)對分區(qū)表的并行查詢,和普通表相比有更加優(yōu)異的性能。
使用說明
PolarDB PostgreSQL版(兼容Oracle)的并行查詢功能默認開啟。
根據(jù)并行的方式,分區(qū)并行可分為分區(qū)間并行、分區(qū)內(nèi)并行和混合并行。
以上三種并行方式都有自己的代價模型,優(yōu)化器會根據(jù)實際情況選擇最優(yōu)的一種。
分區(qū)間并行
分區(qū)間并行是指每個worker查詢一個分區(qū),從而實現(xiàn)多個worker并行查詢整個分區(qū)表。
示例:
EXPLAIN (COSTS OFF) select * from prt1;
QUERY PLAN
-----------------------------------------------
Gather
Workers Planned: 6
-> Parallel Append
-> Seq Scan on prt1_p5
-> Seq Scan on prt1_default
-> Seq Scan on prt1_p4
-> Seq Scan on prt1_p1
-> Seq Scan on prt1_p2
-> Seq Scan on prt1_p3
(9 rows)
如上所示,prt1分區(qū)表中有6個分區(qū):prt1_p1、prt1_p2、prt1_p3、prt1_p4、prt1_p5、prt1_default。整個分區(qū)表啟動了6個并行的Worker(Workers Planned: 6)。每個worker負責(zé)查詢一個分區(qū)。其中,明顯的標(biāo)志是有一個名為Parallel Append
的算子。
分區(qū)內(nèi)并行
分區(qū)內(nèi)并行是指每個分區(qū)內(nèi)部并行查詢,但是整個分區(qū)表是串行的。
EXPLAIN (COSTS OFF) select * from prt1;
QUERY PLAN
-----------------------------------------------
Gather
Workers Planned: 6
-> Append
-> Parallel Seq Scan on prt1_p5
-> Parallel Seq Scan on prt1_default
-> Parallel Seq Scan on prt1_p4
-> Parallel Seq Scan on prt1_p1
-> Parallel Seq Scan on prt1_p2
-> Parallel Seq Scan on prt1_p3
(9 rows)
如上所示,6個worker分別查詢分區(qū)prt1_p1、prt1_p2、prt1_p3、prt1_p4、prt1_p5、prt1_default。分區(qū)間是串行執(zhí)行的,因此也能實現(xiàn)分區(qū)表的并行查詢。
混合并行
混合并行是指分區(qū)間和分區(qū)內(nèi)都可以并行執(zhí)行,以達到分區(qū)表整體的并行執(zhí)行,這是并行度最高的一種并行查詢。
EXPLAIN (COSTS OFF) select * from prt1;
QUERY PLAN
-----------------------------------------------
Gather
Workers Planned: 8
-> Parallel Append
-> Parallel Seq Scan on prt1_p5
-> Parallel Seq Scan on prt1_default
-> Parallel Seq Scan on prt1_p4
-> Parallel Seq Scan on prt1_p1
-> Parallel Seq Scan on prt1_p2
-> Parallel Seq Scan on prt1_p3
(9 rows)
如上所示,整個查詢使用了8個worker進行并行查詢(Workers Planned: 8),每個分區(qū)之間可以并行查詢,每個分區(qū)內(nèi)部也可以并行查詢。