背景

PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持几十种场景的并行计算。

并行计算到底带来了多大的性能提升?

是否满足实时分析的需求?

是否可以支持OLTP与OLAP混合业务使用?

《PostgreSQL 多模, 多应用场景实践》

PostgreSQL 11 并行计算使用场景、性能提升倍数

场景数据量关闭并行开启并行并行度开启并行性能提升倍数
全表扫描10 亿53.4 秒1.8 秒3229.7 倍
条件过滤10 亿53.4 秒1.87 秒3228.6 倍
哈希聚合10 亿142.3 秒4.8 秒3029.6 倍
分组聚合10 亿142.3 秒4.8 秒3029.6 倍
select into10 亿54.5 秒1.9 秒3228.7 倍
create table as10 亿54.7 秒2 秒3027.35 倍
CREATE MATERIALIZED VIEW10 亿54.7 秒2 秒3027.35 倍
create index10 亿964 秒252 秒323.83 倍
parallel CREATE INDEX CONCURRENTLY - 不堵塞读写10亿509.6 秒355 秒161.44 倍
排序10 亿76.9 秒2.75 秒3228 倍
自定义并行聚合1(求 distinct 数组 字段元素、以及count distinct)10 亿298.8 秒8.7 秒3634.3 倍
自定义并行聚合2(求 distinct 普通 字段元素、以及count distinct)10 亿96.5 秒3.43 秒3628 倍
自定义并行函数(UDF)10 亿456 秒16.5 秒3027.6 倍
普通并行(gather)10 亿70.2 秒2.5 秒3028.1 倍
归并并行(gather merge)10 亿78.2 秒2.76 秒3028.3 倍
rc (ud agg count distinct)10 亿107 秒3.65 秒3029.3 倍
rr (ud agg count distinct)10 亿107 秒3.65 秒3029.3 倍
parallel OLAP : 中间结果 parallel with unlogged table ; unlogged table并行求avg case10 亿73.6 秒2.5 秒3029.44 倍
parallel index scan10 亿19 秒1.58 秒2012 倍
parallel bitmap scan10 亿23.98 秒15.86 秒201.5 倍
parallel index only scan10 亿8 秒0.6 秒2013.33 倍
parallel nestloop join10亿 join 10亿 using (i) where t1.i<1000000014.4 秒4.6 秒83.13 倍
parallel merge join10亿 join 10亿 using (i) where t1.i<100000003.2 秒1 秒83.2 倍
parallel hash join10亿 join 10亿 using (i) where t1.i<10000000 and t2.i<100000008.1 秒1 秒208.1 倍
parallel hash join10亿 join 10亿 using (i)1071 秒92.3 秒2011.6 倍
parallel partition table wise join10亿 join 10亿 using (i)1006 秒76 秒2413.2 倍
parallel partition table wise agg10亿191 秒8 秒2423.9 倍
parallel append10亿70.5 秒3.16 秒2422.3 倍
parallel append merge10亿99.4 秒5.87 秒2416.93 倍
parallel union all10亿99 秒5.6 秒2417.68 倍
parallel CTE10亿65.65 秒3.33 秒2419.7 倍
parallel 递归查询, 树状查询, 异构查询, CTE, recursive CTE, connect by异构数据1亿,日志数据10亿5.14 秒0.29 秒2417.7 倍
parallel scan mult FDW tables (通过继承表方式)10亿180 秒7.8 秒2423.1 倍
parallel scan mult FDW tables (通过union all)10亿165.6 秒27.8 秒56 倍
parallel leader process10亿186 秒95 秒12 倍
parallel subquery20亿179.7 秒6.5 秒2827.6 倍

每项测试CASE请见参考部分。

参考

《PostgreSQL 并行计算解说 之29 - parallel 递归查询, 树状查询, 异构查询, CTE, recursive CTE, connect by》

《PostgreSQL 并行计算解说 之28 - parallel CREATE INDEX CONCURRENTLY - 不堵塞读写》

《PostgreSQL 并行计算解说 之27 - parallel subquery》

《PostgreSQL 并行计算解说 之26 - parallel gather | gathermerge - enable leader worker process》

《PostgreSQL 并行计算解说 之25 - parallel FDW scan (并行访问多个外部表) with parallel append (FDW must with IsForeignScanParallelSafe)》

《PostgreSQL 并行计算解说 之24 - parallel CTE (Common Table Express)》

《PostgreSQL 并行计算解说 之23 - parallel union all》

《PostgreSQL 并行计算解说 之23 - parallel append merge》

《PostgreSQL 并行计算解说 之22 - parallel append》

《PostgreSQL 并行计算解说 之21 - parallel partition table wise agg》

《PostgreSQL 并行计算解说 之20 - parallel partition table wise join》

《PostgreSQL 并行计算解说 之19 - parallel hash join》

《PostgreSQL 并行计算解说 之18 - parallel merge join》

《PostgreSQL 并行计算解说 之17 - parallel nestloop join》

《PostgreSQL 并行计算解说 之16 - parallel index only scan》

《PostgreSQL 并行计算解说 之15 - parallel bitmap scan》

《PostgreSQL 并行计算解说 之14 - parallel index scan》

《PostgreSQL 并行计算解说 之13 - parallel OLAP : 中间结果 parallel with unlogged table》

《PostgreSQL 并行计算解说 之12 - parallel in rc,rr 隔离级别》

《PostgreSQL 并行计算解说 之11 - parallel gather, gather merge》

《PostgreSQL 并行计算解说 之10 - parallel 自定义并行函数(UDF)》

《PostgreSQL 并行计算解说 之9 - parallel 自定义并行聚合》

《PostgreSQL 并行计算解说 之8 - parallel sort》

《PostgreSQL 并行计算解说 之7 - parallel create index》

《PostgreSQL 并行计算解说 之6 - parallel CREATE MATERIALIZED VIEW》

《PostgreSQL 并行计算解说 之5 - parallel create table as》

《PostgreSQL 并行计算解说 之4 - parallel select into》

《PostgreSQL 并行计算解说 之3 - parallel agg》

《PostgreSQL 并行计算解说 之2 - parallel filter》

《PostgreSQL 并行计算解说 之1 - parallel seq scan》

https://www.postgresql.org/docs/11/parallel-plans.html

《PostgreSQL 11 并行计算算法,参数,强制并行度设置》

《PostgreSQL 11 preview - 并行计算 增强 汇总》

《PostgreSQL 10 自定义并行计算聚合函数的原理与实践 - (含array_agg合并多个数组为单个一元数组的例子)》

《PostgreSQL 9.6 并行计算 优化器算法浅析》