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,一经查实,立即删除!

相关文章

linux下得到date命令,linux下date命令获得今天日期的用法

1。获取今天日期的各类用法:oracle[roottest ~]# date %Y_%m_%d2016_05_22[roottest ~]# date %Y_%m_%d2016_05_22ide[roottest ~]# date "%Y_%m_%d"2016_05_22[roottest ~]# date %Y_%m_%d2016_05_22[roottest ~]# date "%Y_%m_%d"2016_05_22i…

Quarkus:一个Kubernetes原生Java框架

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

分区安装linux,怎样安装Linux?

我的机子上装了win2000,想装个Linux可是在安装时,竟然D 、E盘都不见了,win2000也进不去了我只得重装2000,现在我都不敢装Linux了请高手指点!|你最好用PQMAGIC先分区,大约2。5G空间就够了,可以参…

linux scp传输文件命令

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

pg10 10.3 1 linux64,Install Postgresql 10 In Ubutnu 16.04 LTS

PostgreSQL数据库是一个高性能的全功能的开源关系型数据库,这里讲解一下如何在Ubuntu 16.04 LTS 下安装 PostgreSQL 10。添加软件源wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -sudo sh -c echo "deb http://apt.po…

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

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

linux虚拟光驱挂载方法,Linux操作系统下虚拟光驱(iso)的挂载

1、挂载iso文件一般查看iso文件内容,只需要:#mount -t iso9660 -o loop xxx.iso /mnt/cdrom就可以在/mnt/cdrom下看到xxx.iso的内容。2、复制光盘为iso镜像#dd if/dev/hdb ofxxx.iso或者#cp /dev/cdrom xxx.iso3、虚拟iso为设备#rm -rf /dev/cdrom //删除…

[深度概念]·K-Fold 交叉验证 (Cross-Validation)的理解与应用

个人主页--> xiaosongshine.github.io/ 1.K-Fold 交叉验证概念在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合…

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查看usb鼠标是否启动,Linux USB鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为多个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。下文阴影部分为注解。一、 驱动加载部分static int __init usb_mouse_init(void){int retval usb_register(&usb_mouse_…

退役前的最后的做题记录upd:2019.04.04

考试考到自闭&#xff0c;每天被吊打。 还有几天可能就要AFO了呢。。。 Luogu3602&#xff1a;Koishi Loves Segments 从左向右&#xff0c;每次删除右端点最大的即可。 [HEOI2014]南园满地堆轻絮 答案一定是 \(\lceil \frac{max_{1\le i < j \le n}(a_i-a_j)}{2} \rceil\)。…

linux ssh-add,linux – 如何使ssh-add从文件读取密码?

根据您的发行版本和ssh-add的版本,您可以使用或不使用以这种方式从stdin读取密码的ssh-add的-p选项&#xff1a;cat passfile | ssh-add -p keyfile如果这不工作,您可以使用Expect,Unix工具使交互式应用程序非互动.你必须从你的包管理器安装它.我为你准备了一个工具.只需将内容…

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

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

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

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

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

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

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

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

高级语言程序设计c 华南理工,华南理工大学高级语言程序设计(C)期末练习题

.. 《高级语言程序设计(C)》练习题一&#xff0e;单项选择题1.用C语言编制的源程序要变为目标程序必须要经过( )。(a) 解释(b) 汇编(c) 编辑(d) 编译2. 执行C程序时出现的“溢出”错误属于( )错误。(a) 编译(b) 连接(c) 运行(d) 逻辑3. 按C标识符的语法规定&#xff0c;合法的标…

bevfusion 学习笔记

目录 tensorrt ros部署&#xff1a; 也依赖ros2 c ros2安装指导&#xff1a; 相机标定工具源码&#xff1a; 官方github&#xff0c;部分模型开源 tensorrt ros部署&#xff1a; https://github.com/linClubs/BEVFusion-ROS-TensorRT 也依赖ros2 c GitHub - newintelli…

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

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