PostgreSQL 并行查询概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

PostgreSQL从9.6版本开始加入并行查询,并在PostgreSQL10和PostgreSQL11分别做了大量加强工作。下面从:

  • 何时启用并行查询功能
  • 并行查询是如何工作的
  • worker进程数量越多,查询性能越高吗

 三个方面简单介绍下并行查询的机制。

--------------------------------------------------------------------------------

何时启用并行查询功能

    是否启用并行查询实际上有诸多因素决定。总的来说,有以下两个方面:

  •    并行查询开关等参数

        在PostgreSQL系统中,并行查询的开关是max_parallel_workers_per_gather,它所表示的是单个Gather节点所能开启的最大worker进程数量。当设置为0时,是 禁用并行查询,即没有可提供的并行查询的worker进程;该参数的默认值是2,即每个Gather节点最多可以有2个worker进程。需要注意的是,postgresql.conf文件中还有一个名为force_parallel_mode的参数(看参数名感觉像是并行查询的开关参数),其实它表示是否强制开启并行查询,多用于测试为目的。如果设置为on,则无论何时都会进行并行查询(实际上,这时并不见得会带来查询效率的提高,后面会有介绍),其默认值为off,这时系统会根据具体成本考虑是否启用并行查询。

        在并行查询中,每个worker进程都会承担部分的查询工作。除了上面说的max_parallel_workers_per_gather参数外,系统还有一个参数max_parallel_workers,它决定系统所支持的最大的worker进程的数量,所以max_parallel_workers_per_gather的设定必须参考max_parallel_workers的值。当然,它们都得受限于max_worker_process(系统允许后台开启worker进程的最大数量)参数。

  •    并行查询成本考虑

        当参数决定可以进行并行查询后,实际上是否可以进行并行查询,还得进行一些成本上的考虑。因为并行查询除了能带来并行查询上的效率外,还会有一些成本的消耗,比如并行带来的数据分片,进程间的通信以及并发控制所带来的的系统的开销等。当数据量足够大时,并行查询带来的效率可以抵消这些成本考虑;但是数据量比较小时,并行查询可能不会带来效率的提升,反而会降低了原有的性能。而对于并行带来的成本,系统需要进行计算其代价,然后决定是否启用并行查询。

        在配置文件中,有专门对并行查询成本的设置:

	parallel_tuple_cost = 0.1              # 后天进程传递tuple的代价parallel_setup_cost = 1000.0           # worker进程的启动成本min_parallel_table_scan_size = 8MB     # 并行查询规定表的最小数据量min_parallel_index_scan_size = 512kB   # 并行查询规定的索引的最小数据量

        系统就是依托上面的参数进行计算并行查询的成本。这些参数基本上采用默认值就好,当然除非有特殊要求或特殊环境。

并行查询是如何工作

    以普通查询为例,下面看一下简单查询的示例:

highgo=# explain analyze select * from test where n = 9999;QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------Gather  (cost=1000.00..11822.39 rows=3984 width=36) (actual time=2.014..196.880 rows=1 loops=1)Workers Planned: 2Workers Launched: 2->  Parallel Seq Scan on test  (cost=0.00..10423.99 rows=1660 width=36) (actual time=76.604..141.282 rows=0 loops=3)Filter: (n = 9999)Rows Removed by Filter: 333333Planning time: 0.044 msExecution time: 196.904 ms
(8 行记录)

通过EXPLAIN可以查看并行查询的执行计划。当用户输入一个查询语句时,查询分析,查询重写以及查询规划都和原来一样,只有到执行计划时,才开始真正进入并行查询环节。上面执行计划中,Gather节点只是执行计划的一个子节点,属于执行计划的一部分,当查询执行走到Gather节点时,会话进程会申请一定数量的worker进程(根据配置参数,以及成本确定)来进行并行查询过程。在这些worker进程中,有一个充当leader worker的角色,负责收集汇总各个worker进程查询的结果。该leader worker进程也会根据查询的数据量大小承担部分的并行查询部分。执行过程如下图所示:

 

        Leader worker进程和其他worker进程通过动态共享内存进行通信。其他worker进程(包括leader worker进程)把分担查询的结果存储到共享内存中,然后由leader worker进程进行汇总整个查询的结果。所以需要注意的是,由于并行查询需要使用了动态共享内存,所以dynamic_shared_memory_type参数需要设置为none以外的值。

 

worker进程数量越多,查询性能越高吗

前面也提到,并不是所有的查询都能适用于并行查询。因为考虑到系统的开销以及进程占用资源的情况,也并不是开启的worker数量越多,查询效率越高。下面以对同一个表做同样的查询,然后开启不同的worker数量来测试一下。

  • 开启 1 个worker 进程
highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ----------------------------------------------------------------------------------------------Gather  (cost=1000.00..59888.81 rows=1 width=4) (actual time=244.328..301.458 rows=1 loops=1)Workers Planned: 1Workers Launched: 1->  Parallel Seq Scan on test  (cost=0.00..58888.71 rows=1 width=4) (actual time=268.845..297.372 rows=0 loops=2)Filter: (n = 4000000)Rows Removed by Filter: 2500000Planning time: 0.119 msExecution time: 302.026 ms
(8 rows)
  • 开启 2 个worker 进程
highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ----------------------------------------------------------------------------------------------Gather  (cost=1000.00..49165.77 rows=1 width=4) (actual time=218.212..218.287 rows=1 loops=1)Workers Planned: 2Workers Launched: 2->  Parallel Seq Scan on test  (cost=0.00..48165.67 rows=1 width=4) (actual time=200.619..213.684 rows=0 loops=3)Filter: (n = 4000000)Rows Removed by Filter: 1666666Planning time: 0.117 msExecution time: 219.005 ms
  • 开启 4 个worker 进程

        设置4个worker,但是实际上基于成本考虑只启用了3个。    

highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ---------------------------------------------------------------------------------------------Gather  (cost=1000.00..43285.39 rows=1 width=4) (actual time=190.967..191.017 rows=1 loops=1)Workers Planned: 3Workers Launched: 3->  Parallel Seq Scan on test  (cost=0.00..42285.29 rows=1 width=4) (actual time=174.275..182.767 rows=0 loops=4)Filter: (n = 4000000)Rows Removed by Filter: 1250000Planning time: 0.119 msExecution time: 191.817 ms
(8 rows)

 

  • 通过create table test(n int) with (parallel_workers = 4);强制启动4个worker进程测试。
highgo=# explain analyze select * from test where n = 4000000;QUERY PLAN                                          ----------------------------------------------------------------------------------------------Gather  (cost=1000.00..38749.10 rows=1 width=4) (actual time=181.145..181.315 rows=1 loops=1)Workers Planned: 4Workers Launched: 4->  Parallel Seq Scan on test  (cost=0.00..37749.00 rows=1 width=4) (actual time=163.565..169.837 rows=0 loops=5)Filter: (n = 4000000)Rows Removed by Filter: 1000000Planning time: 0.050 msExecution time: 185.391 ms

对比查询结果:

1 worker 进程2 worker 进程3 worker 进程4 worker 进程
302.026 ms219.005 ms191.817 ms185.391 ms

可以看出,查询效率并没有随worker数量线性增加;在启用3个worker进程 和 4个worker进程进行并行查询时,查询效率基本一致了。所以并不是开启的worker数量越多,查询效率越高,这个也是系统有成本考虑在内。

 

 

转载于:https://my.oschina.net/tianbing/blog/3029493

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quarkus:一个Kubernetes原生Java框架

Red Hat发布了Quarkus,这是一个为GraalVM和OpenJDK HotSpot量身定制的Kubernetes原生Java框架。Quarkus的目标是使Java成为Kubernetes和无服务器环境中的领先平台,为开发人员提供统一的反应式和命令式编程模型。 Quarkus利用Java开发人员使用的一系列库&…

linux scp传输文件命令

scp -r /opt/test root192.168.2.105:/opt 转载于:https://www.cnblogs.com/LynnChen/p/10620576.html

nginx能访问html静态文件但无法访问php文件

nginx.conf中红框部分修改成你的实际网站根目录转载于:https://www.cnblogs.com/IT-Crowd/p/10626549.html

linux mariadb 升级,linux mariadb

linux mariadb转载 一 安装下载mariaDB MariaDB-5.5.29-rhel5-x86_64-common.rpm 和MariaDB-5.5.29-rhel5-x86_64-server.rpm 包,MariaDB-5.5.29-rhel5-x86_64-client.rpm2.然后再http.//yum。mariadb。org/ 找到 RPM-GPG-KEY-MariaDB 这个PGP文件,把文件放入到/etc…

Linux Note

日期:2019/3/31 内容:Linux学习笔记 一、Linux命令 ls -l 操作效果 第一列:文件权限 一共10位。 01(r)2(w)3(x)4(r)5(w)6(x)7(r)8(w)9(x)文件类型文件所有者权限 usr权限,u权限文件所有者所属组成员的权限 group权限,g…

linux nginx F配置,linux下nginx的安装及配置

1、安装nginx前,咱们首先要确保系统安装了g、gcc、openssl-devel、pcre-devel和zlib-devel软件,可经过如图所示命令进行检测,若是以安装咱们能够经过图二所示卸载:linuxyum install gcc-cyum -y install zlib zlib-devel openssl openssl--de…

你缺啥,你缺一个得力的办公软件

其实你缺啥我都知道,但是,我又不能给你发工资,还得你自己努力工作才行。不过我可以给你分享几款好用的办公软件,对你在进行有效率的办公会有很大帮助的。曲奇办公是一款以文档为载体的企业办公管理应用。帮助企业快速实现业务标准…

C语言做一个表格的程序,用C语言画个简单表格

今天见到个题目,就把他做了,题目如下:在图形环境中很容易做出漂亮的表格。但在控制台环境中就比较困难了。有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看)-------------|abc |xyztt|…

深度学习框架PyTorch一书的学习-第四章-神经网络工具箱nn

参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 本章介绍的nn模块是构建与autograd之上的神经网络模块 除了nn外还会介绍神经网络中常用的工具,比如优化器optim、初始化init等 1.nn.Mod…

地铁售票系统设计思想及部分代码

设计思想:地铁售票系统的关键点在于换乘,所以首先要分为换乘和不换乘两种情况。不换乘比较简单,通过起始站名和终点站名查询他们的num,然后list打包输出到jsp就可以。换乘的话就先要找到两条线路,找到两条线路的交点也…

浏览器拦截跨域请求处理方法(已阻止跨源请求:同源策略禁止读取远程资源)

原文地址:http://my.oschina.net/lichaoqiang/blog/317823 在浏览器请求中,出现跨域访问资源的问题,我们肯定会遇到。如果跨域请求被阻止,有可能导致css、js 、ajax请求、font字体等资源出现无法正常访问的问题。接下来&#xff0…

面向视频的全新AI架构 —— 阿里云智能视觉技术全解

2019独角兽企业重金招聘Python工程师标准>>> 我们都知道,AI技术正在以可见的速度被应用于各行各业,然而绝大部分业务场景想应用AI技术,都需要算法工程师根据自身业务的标注数据,来进行单独训练,才能打磨出合…

【转】利用python的KMeans和PCA包实现聚类算法

转自:https://www.cnblogs.com/yjd_hycf_space/p/7094005.html 题目: 通过给出的驾驶员行为数据(trip.csv),对驾驶员不同时段的驾驶类型进行聚类,聚成普通驾驶类型,激进类型和超冷静型3类 。 利用Python的s…

c 语言str.size,C/C++ strlen(str)和str.length()和str.size()的区别

strlen(str)和str.length()和str.size()都可以求字符串长度,返回字符串中字符的长度,不包括‘/0’。其中str.length()和str.size()是同义词,返回同样的值。strlen(str)是用于求字符数组的长度,其参数是char*。#include #include using namesp…

想跑次高频策略?快来看看Numpy处理真格量化tick数据的技巧

使用澎博真格量化时,很多用户希望用numpy处理tick数据,包括tick数据的留存和运算。 这里有一些技巧。 因为tick数据量比较大,为了降低系统的运算负担,我们不应该在内存里保存大量tick数据。 比如我们只想保存过去10个tick。 可以在…

日本显示屏巨头JDI不敌业务压力,宣布接受中方注资...

本次10亿美元的融资金额中,其中7.2亿美元据传来自中国丝绸之路基金。 最初,在液晶领域日本企业一直都占据着主要市场,如夏普、NEC、东芝等。后来随着韩国三星、LG的强势进入,日本企业的生存空间开始被抢占,现如今中国…

c语言中 d 1是啥意思,空开D/C是什么意思?终于有人把它说清楚了!

原标题:空开D/C是什么意思?终于有人把它说清楚了!空气开关是每个人家里必用的东西,但是你到五金店一看,大大小小的开关插座多了去,让人眼花缭乱。怎么选呢?空开有各种字母型号,这些字…

微信小程序开发 | 官方问答精选

2019独角兽企业重金招聘Python工程师标准>>> SF问答精选《七》 多组件显示与隐藏如何实现、function中的...SF问答精选《六》canvas不显示问题SF问答精选《五》菜单内容左右联动、生命周期函数SF问答精选《四》eslint 配置使用 co function;apache 反向代…

清北学堂培训2019.4.4

第一次培训,心情有点激动(尽管没了清明节),还见到了各地的dalao们,十分开森 Day 1(李昊dalao) 上午篇 上午呢,主要讲了关于高精,快速幂,膜模意义下的运算&…

swft c 语言 数组,如何在swift中实现数组的深拷贝

在Objective-C中如果想将一个数组赋值给另外一个数组,同时想让两个数组之间相互独立(即改变其中的一个数组,不影响另外的一个),有很多的办法,比如我们可以直接copy,用类方法创建新数组。这样得到的数组和原来的数组就是两个完全独…