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

You may also like...