PostgreSQL – 让PostGIS用上PostgreSQL的并行
目录
为啥放一张佩奇?它的真实面目其实是汽车里的涡轮,涡轮增压可以让小排量的发动机有大排量发动机的爆发力。佩奇都已经配送了涡轮,号称”涡轮猪“,PostgreSQL怎么能不跟跟时尚。postgresql中,并行计算就是涡轮,利用好并行计算,你的postgresql就是涡轮增压postgresql了,无痛享受数倍加速!怎么样,这个类比是不是有点尴尬,但话糙理不糙,总之,用并行计算为你的查询加速吧!
这里我们先讲讲PostgreSQL中并行计算历史,如何使用,效果及其注意的点。
9.6引入并行计算,之后的10和11不断添砖加瓦。
PostgreSQL 10
- 新增min_parallel_table_scan_size和min_parallel_index_scan_size,用于控制超过多大的表大小(bytes)和索引大小(bytes)时,计划中会使用并行;
- 并行btree扫描;
- 并行bitmap heap扫描;
- 并行merge joins;
- 允许无关的子查询使用并行;
- 新增max_parallel_worker,用来控制并行数量;
- pg_stat_activity中可以查询到parallel worker的查询;
PostgreSQL 11
- 创建btree索引时可以并行;
- create table .. as,create materialized .. view和一些union可以并行;
- 优化了并行哈希连接(hash join)和并行顺序扫描(sequence scan)。
地理数据中的操作是典型的计算量大的操作。
结构
汇总线程(Gather Node)
汇总线程是管理的角色,其派生出多个工作线程,把任务分解为多个任务,分别派给工作线程,最后汇总结果。
工作线程(Worker)
工作线程实际执行被分配的任务。
原理
设置并行模式
要使用并行,有一些GUC是必须配置的:
- max_parallel_workers_per_gather,每个gather进程可启动的worker进程最大数量;
- max_parallel_workers,pg可以启动的parallel worker进程最大数量;
- max_worker_process,pg可以启动的worker进程最大数量;
- parallel_leader_participation,gather进程是否应该参与计算。
此外,还有一些GUC决定了计划器是否会引入并行机制。只有计划器认为执行查询的开销大于下面的阈值设定,才会启用并行计划:
- parallel_tuple_cost,在两个parallel worker线程直接传递单行数据的开销,默认0.1;
- parallel_setup_cost,启动parallel worker线程的开销,默认1000;
- min_parallel_table_scan_size,执行查询需要扫描的表数据大小,默认8M;
- min_parallel_index_scan_size,执行查询需要扫描的表索引大小,默认512K;
pg11中并行模式默认是启用的,我们使用explain可以查看某个查询是否以并行的方式执行。
什么时候并行不可用
- 涉及到对现有表写数据或锁行的查询,create table as、select into、
create materialized view等创建新表的操作
例外 - 包含CTE(with)的查询不支持并行
转载自:https://blog.csdn.net/qingyafan/article/details/88077729