1 并行查询相关配置参数
介绍PostgreSQL并行查询之前先来介绍并行查询的几个重要参数。
- 1. max_worker_processes(integer)
设置系统支持的最大后台进程数,默认值为8,如果有备库,备库上此参数必须大于或等于主库上的此参数配置值,此参数调整后需重启数据库生效。
- 2.max_parallel_workers (integer)
设置系统支持的并行查询进程数,默认值为8,此参数受max_worker_processes参数限制,设置此参数的值比 max_worker_processes值高将无效。
当调整这个参数时建议同时调整max_parallel_workers_per_gather参数值。
- 3.max_parallel_workers_per_gather (integer)
设置允许启用的并行进程的进程数,默认值为2,设置成0表示禁用并行查询,此参数受max_worker_processes参数和max_parallel_workers参数限制,因此并行查询的实际进程数可能比预期的少,并行查询比非并行查询消耗更多的CPU、IO、内存资源,对生产系统有一定影响,使用时需考虑这方面的因素,这三个参数的配置值大小关系通常如下所示:
max_worker_processes > max_parallel_workers > max_parallel_workers_per_gather
- 4.parallel_setup_cost(floating point)
设置优化器启动并行进程的成本,默认为1000。
- 5. parallel_tuple_cost(floating point)
设置优化器通过并行进程处理一行数据的成本,默认为0.1。
- 6. min_parallel_table_scan_size(integer)
设置开启并行的条件之一,表占用空间小于此值将不会开启并行,并行顺序扫描场景下扫描的数据大小通常等于表大小,默认值为8MB。
- 7. min_parallel_index_scan_size(integer)
设置开启并行的条件之一,实际上并行索引扫描不会扫描索引所有数据块,只是扫描索引相关数据块,默认值为512kb。
- 8.force_parallel_mode (enum)
强制开启并行,一般作为测试目的,OLTP生产环境开启需慎重,一般不建议开启。本章节中 postgresql.conf配置文件设置了以下参数:
max_worker_processes = 16
max_parallel_workers_per_gather = 4 #taken from max_parallel_workers
max_parallel_workers = 8
parallel_tuple_cost = 0.1
parallel_setup_cost = 1000.0
min_parallel_table_scan_size = 8MB
min_parallel_index_scan_size = 512kB
force_parallel_mode = off
2 并行扫描
2.1 并行顺序扫描
介绍并行顺序扫描之前先介绍顺序扫描(sequential scan),顺序扫描通常也称之为全表扫描,全表扫描会扫描整张表数据,当表很大时,全表扫描会占用大量CPU、内存、IO资源,对数据库性能有较大影响,在OLTP事务型数据库系统中应当尽量避免。
2.2 并行索引扫描
PostgreSQL10对并行扫描的支持将提升范围扫描SQL的性能,由于开启并行将消耗更多的CPU、内存、IO资源,设置并行进程数时得合理考虑,另一方面,目前PostgreSQL 10暂不支持非btree 索引类型的并行索引扫描。
2.3 并行index-only扫描
了解并行index-only扫描之前首先介绍下index-only扫描,顾名思义,index-only扫描是指只需扫描索引,也就是说SQL仅根据索引就能获得所需检索的数据,而不需要通过索引回表查询数据。例如,使用SQL统计ID小于100万的记录数,在开始测试之前,先在会话级别关闭并行,如下所示:
2.4 并行 bitmap heap扫描
介绍并行bitmap heap扫描之前先了解下Bitmap Index扫描和Bitmap Heap扫描,当SQL的 where条件中出现 or时很有可能出现 Bitmap Index扫描,如下所示:
6.3 并行聚合
聚合操作是指使用count()、sum()等聚合函数的SQL,以下执行count()函数统计表记录总数,执行计划加下所示:
从以上执行计划看出,首先进行Partial Aggregate,开启了四个并行进程,最后进行Finalize Aggregate,此SQL执行时间为2474毫秒,在操作系统层面通过top命令能看到EXPLAIN ANALYZE命令的四个子进程。