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扫描,从执行时间来看,不开启并行比开启并行性能低了不少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值