PostgreSQL 并行查询
了解Oracle的朋友应该知道Oracle支持并行查询,比如 SELECT、UPDATE、DELETE大事务开启并行功能后能利用多核CPU,从而充分发挥便件性能,提升大事物处理效率,PostgreSQL在9.6版本前还不支持并行查询,SQL无法利用多核CPU提开性能,9.0放个开始支持并行查询,只是9.6版本的并行查询所支持的范围非常有限,例如只在顺序扫描、多表关联、聚合查询中支持并行,10版本增强了并行查询功能,例如增加了并行索引扫描、并行index-only扫描、并行 bitmap heap扫描等,本章将介绍PostgreSQL10的并行查询功能。
1、并行查询相关配置参数
2、并行扫描
- 顺序扫描(sequential scan):介绍并行顺序扫描之前先介绍顺序扫描(sequential scan),顺序扫描通常也称之为全表扫描,全表扫描会扫描整张表数据,当表很大时,全表扫描会占用大量CPU、内存、IO资源,对数据库性能有较大影响,在OLTP事务型数据库系统中应当尽量避免。
mydb=# create table test_big1(
mydb(# id int4,
mydb(# name character varying(32),
mydb(# create_time timestamp without time zone default clock_timestamp());
CREATE TABLE
mydb=# insert into test_big1(id, name) values(1,'z3');
INSERT 0 1
mydb=# insert into test_big1(id, name) values(2,'li4');
INSERT 0 1
mydb=# insert into test_big1(id, name) values(3,'w5');
INSERT 0 1
mydb=# explain select * from test_big1 where name='li4';
QUERY PLAN
-----------------------------------------------------------
Seq Scan on test_big1 (cost=0.00..18.25 rows=3 width=94)
Filter: ((name)::text = 'li4'::text)
(2 rows)
2.1 并行顺序扫描
PostgreSQL 中的顺序扫描在9.6版本开始支持并行处理,并行顺序扫描会产生多个子进程,并利用多个逻辑CPU并行全表扫描,一个并行顺序扫描的执行计划如下所示:
mydb=# explain analyze select * from test_big1 where name='li4';
QUERY PLAN
--------------------------------------------------------------------------------------------------
---
Seq Scan on test_big1 (cost=0.00..18.25 rows=3 width=94) (actual time=0.009..0.010 rows=1 loops=
1)
Filter: ((name)::text = 'li4'::text)
Rows Removed by Filter: 2
Planning Time: 0.046 ms
Execution Time: 0.063 ms
(5 rows)
2.2 并行索引扫描
- 索引扫描( index scan),在表上创建索引后,进行索引扫描。
索引扫描也支持并行,称为并行索引扫描( Parallel index scan)进行了并行索引扫描,开启了多个并行进程,在会话级别关闭并行查询。
PostgreSQL10对并行扫描的支持将提升范围扫描SQL的性能,由于开启并行将消耗更多的CPU、内存、IO资源,设置并行进程数时得合理考虑,另一方面,目前PostgreSQL 10暂不支持非btree索引类型的并行索引扫描。
2.3 index-only扫描
了解并行index-only扫描之前首先介绍下index-only扫描,顾名思义,index-only扫描是指只需扫描索引,也就是说SQL仅根据索引就能获得所需检索的数据,而不需要通过索引回表查询数据。
介绍并行bitmap heap扫描之前先了解下Bitmap Index扫描和 Bitmap Heap扫描
从以上执行计划看出,首先执行两次Bitmap Index扫描获取索引项,之后将BitmapIndex扫描获取的结果合起来回表查询,这时在表test_bigl上进行了Bitmap Heap扫描。Bitmap Heap扫描也支持并行。
Bitmap Heap扫描,从执行时间来看,不开启并行比开启并行性能低了不少。