背景
PostgreSQL 并行计算原理、应用参考:
优化器并行计算的并行度计算方法
1、总worker进程数
1. postgres=# show ;
2. max_worker_processes
3. ----------------------
4. 128
5. (1 row)
2、所有会话,在同一时刻的QUERY,并行计算最大允许开启的WORKER数。
1. max_parallel_workers
3、单条QUERY中,每个node最多允许开启的并行计算WORKER数
1. postgres=# show max_parallel_workers_per_gather ;
2. max_parallel_workers_per_gather
3. ---------------------------------
4. 0
5. (1 row)
4、单个query, node的并行度
1. Min(parallel_workers(表级设置,没有设置则,根据表大小计算得到), max_parallel_workers_per_gather)
5、表级并行度参数,默认不设置,从表大小计算。
1. postgres=# alter table pa set (parallel_workers =32);
2. ALTER TABLE
6、真实并行度算法
1. min (max_worker_processes - 已运行workers ,
2. max_parallel_workers - 其他会话当前真实启用的并行度 ,
3. Min(parallel_workers(表级设置,没有设置则,根据表大小计算得到), max_parallel_workers_per_gather)
4. )
优化器是否选择并行计算
优化器是否使用并行计算,取决于CBO,选择成本最低的方法,并行计算成本估算,成本因子参数如下:
1. postgres=# show parallel_tuple_cost ;
2. parallel_tuple_cost
3. ---------------------
4. 0
5. (1 row)
7. postgres=# show parallel_setup_cost ;
8. parallel_setup_cost
9. ---------------------
10. 0
11. (1 row)
如果非并行计算的执行计划成本低于并行计算的成本,则不使用并行计算。
优化器是否忽略并行计算
如果表扫描或索引扫描的表或索引低于设置的阈值,这个表扫描或索引扫描则不启用并行计算。
1. postgres=# show min_parallel_table_scan_size ;
2. min_parallel_table_scan_size
3. ------------------------------
4. 0
5. (1 row)
7. postgres=# show min_parallel_index_scan_size ;
8. min_parallel_index_scan_size
9. ------------------------------
10. 0
11. (1 row)
优化器强制选择并行计算参数
1. #force_parallel_mode = on
并行计算相关参数
1、创建索引,CREATE TABLE AS,SELECT INTO 的并行度
1. postgres=# show max_parallel_maintenance_workers ;
2. max_parallel_maintenance_workers
3. ----------------------------------
4. 24
5. (1 row)
2、并行分区表JOIN
1. #enable_partitionwise_join = on
3、并行分区表分区聚合
1. #enable_partitionwise_aggregate = on
4、并行HASH计算
1. #enable_parallel_hash = on
5、LEADER主动获取并行WORKER的返回结果
1. parallel_leader_participation = on
6、并行APPEND(分区表),UNION ALL查询
1. #enable_parallel_append = on
强制并行
强制并行度24
1. 1、总的可开启的WORKER足够大
2. postgres=# show max_worker_processes ;
3. max_worker_processes
4. ----------------------
5. 128
6. (1 row)
8. 2、所有会话同时执行并行计算的并行度足够大
9. postgres=# set max_parallel_workers=64;
10. SET
12. 3、单个QUERY中并行计算NODE开启的WORKER=24
13. postgres=# set max_parallel_workers_per_gather =24;
14. SET
16. 4、所有表和索引扫描允许并行
17. postgres=# set min_parallel_table_scan_size =0;
18. SET
19. postgres=# set min_parallel_index_scan_size =0;
20. SET
22. 5、并行计算优化器成本设置为0
23. postgres=# set parallel_tuple_cost =0;
24. SET
25. postgres=# set parallel_setup_cost =0;
26. SET
28. 6、设置表级并行度为24
29. postgres=# alter table pa set (parallel_workers =24);
30. ALTER TABLE
32. 7、效果,强制24并行。
33. postgres=# explain (analyze) select count(*) from pa;
34. QUERY PLAN
35. -------------------------------------------------------------------------------------------------------------------------------------
36. Finalize Aggregate (cost=1615.89..1615.89 rows=1 width=8) (actual time=81.711..81.711 rows=1 loops=1)
37. -> Gather (cost=1615.83..1615.83 rows=24 width=8) (actual time=81.572..90.278 rows=25 loops=1)
38. Workers Planned: 24
39. Workers Launched: 24
40. -> Partial Aggregate (cost=1615.83..1615.83 rows=1 width=8) (actual time=58.411..58.411 rows=1 loops=25)
41. -> Parallel Seq Scan on pa (cost=0.00..712.71 rows=416667 width=0) (actual time=0.012..35.428 rows=400000 loops=25)
42. Planning Time: 0.449 ms
43. Execution Time: 90.335 ms
44. (8 rows)
函数并行
1、并行函数
1. create or replace function ftest(int) returns boolean as $$
2. select $1<1000;
3. $$ language sql strict
4. parallel safe;
6. -- parallel safe 语法
2、并行聚合函数
1. combinefunc
《PostgreSQL 11 preview - 多阶段并行聚合array_agg, string_agg》
《PostgreSQL Oracle 兼容性之 - 自定义并行聚合函数 PARALLEL_ENABLE AGGREGATE》
《PostgreSQL 10 自定义并行计算聚合函数的原理与实践 - (含array_agg合并多个数组为单个一元数组的例子)》
GPU并行
《PostgreSQL GPU 加速(HeteroDB pg_strom) (GPU计算, GPU-DIO-Nvme SSD, 列存, GPU内存缓存)》
