当前位置: 首页 > news >正文

【赵渝强老师】PostgreSQL的并行查询

1

​PostgreSQL数据库能设计出利用多CPU让查询更快的查询计划。这种特性被称为并行查询。对于那些可以从并行查询获益的查询来说,并行查询带来的速度提升是显著的。很多查询在使用并行查询时比之前快了超过两倍,有些查询是以前的四倍甚至更多的倍数。那些访问大量数据但只返回其中少数行给用户的查询最能从并行查询中获益。

image.png
点击这里查看视频讲解:【赵渝强老师】PostgreSQL的并行查询

一、 并行查询如何工作

PostgreSQL的并行化包含三个重要组件:进程本身(Leader进程)、Gather、Workers。没有开启并行化的时候,进程自身处理所有的数据;一旦计划器决定某个查询或查询中部分可以使用并行的时候,就会在查询的并行化部分添加一个Gather节点,将Gather节点作为子查询树的根节点,并根据并行查询的参数设置创建相应的Worker节点;最终由Worker节点执行相应的并行查询功能。PostgreSQL并行查询的工作原理如下图所示。

2

查询执行是从Leader进程开始。一旦开启了并行或查询中部分支持并行,就会分配一个gather节点和多个Worker线程。相关联的Blocks在各个Worker线程之间划分。Worker的数量受PostgreSQL的配置参数控制。Worker之间使用共享内存相互协调和通信,一旦Worker完成了自己的工作,结果就被传给了Leader进程。

二、 何时会用到并行查询?

要了解并行查询之前,首先介绍一下顺序扫描。下面通过一个例子来说明。

(1)创建一张表并插入数据,执行一个简单的查询,并输出执行计划。

mydemodb=# create table testtable1(tid int,tname varchar(20));
mydemodb=# insert into testtable1 values(0,'aaaa');
mydemodb=# explain select * from testtable1;# 输出的信息如下:QUERY PLAN                           
---------------------------------------------------------------Seq Scan on testtable1  (cost=0.00..22.70 rows=1270 width=36)
(1 row)# 这里的Seq Scan表示顺序扫描。

(2)现在往表中插入5千万条数据。

mydemodb=# insert into testtable1 select n,'myname_'||n from generate_series(1,50000000) n;

(3)执行下面的查询,并输出执行计划

mydemodb=# explain analyze select * from testtable1 where tname ='myname_10';# 输出的信息如下:QUERY PLAN                      
-------------------------------------------------------------------Gather  (cost=1000.00..687114.39 rows=1 width=19) (actual time=0.224..1884.530 rows=1 loops=1)Workers Planned: 2Workers Launched: 2->  Parallel Seq Scan on testtable1(cost=0.00..686114.29 rows=1 width=19) (actual time=2370.242..4742.404 rows=0 loops=2)Filter: (tname = 'myname_10'::text)Rows Removed by Filter: 25000000Planning Time: 0.051 msExecution Time: 1884.549 ms其中:
(*)Workers Planned: 2 表示执行查询预估的并行进程数
(*)Workers Launched: 2表示实际启动的并行进程数
(*)Parallel Seq Scan on testtable1表示对表进行了并行的顺序扫描

(4)关闭并行查询,并重新生成上面的执行计划。

mydemodb=# set max_parallel_workers_per_gather = 0;
mydemodb=# explain analyze select * from testtable1 where tname ='myname_10';# 输出的信息如下:QUERY PLAN                      
-----------------------------------------------------------------Seq Scan on testtable1  (cost=0.00..943470.90 rows=1 width=19) (actual time=0.028..3608.929 rows=1 loops=1)Filter: (tname = 'myname_10'::text)Rows Removed by Filter: 49999999Planning Time: 0.215 msExecution Time: 3608.948 ms# 从这里的测试可以得出结论:
# 开启了并行查询耗时1884毫秒;
# 关闭并行查询后,耗时3608毫秒。性能降低了一倍。

下表列举出了影响并行查询的相关参数及其含义。

3

http://www.jsqmd.com/news/104440/

相关文章:

  • 9、量子计算与区块链在金融服务领域的应用
  • 企业CI/CD选型指南:提效与安全如何兼得?CCI破解企业研发“不可能三角”
  • 最新昆明婚纱摄影星级排名新鲜出炉:三大优质机构深度测评+避坑指南 - charlieruizvin
  • EmotiVoice语音合成断点续传功能:大文件生成不中断
  • 展厅设计哪家靠谱?纪念馆展馆设计哪家好? - mypinpai
  • 我与C++的初遇:一段跨越时光的编程情缘
  • 太贵?爱创猫靠谱省钱
  • GB/T40032-2021《电动汽车换电安全要求》IPX9K防水测试
  • 如何提升零样本克隆的音质还原度?技巧分享
  • 高性价比之选:无线耳机选什么品牌?漫步者对比小米谁更具诚意?
  • Win11 查找并开启 IE 浏览器教程
  • 【赵渝强老师】PostgreSQL的控制文件
  • 使用windows记事本打开文件后,程序无法读取文件内容
  • 拿到Photoshop的源码了,发现两个意想不到的秘密......
  • 网络服务器防攻击设置通常不需要深入编程,但需要结合配置、工具和策略
  • 网络服务器防攻击设置通常不需要深入编程,但需要结合配置、工具和策略
  • SQL常用语法全解析:从入门到进阶的实战指南
  • 抱歉,C# 已经跌出第一梯队!
  • 基于SpringBoot的宠物医院管理系统(毕业设计项目源码+文档)
  • 基于Python的物业管理系统源码设计与文档
  • 抗衰老必选!NMN十大品牌评测,奥本元名列第一 - 资讯焦点
  • 基于SpringBoot的宠物医院管理系统的设计与实现(毕业设计项目源码+文档)
  • 从研究到落地:EmotiVoice推动学术成果商业化
  • 我的新能源车企,如何靠六西格玛培训跑赢质量与成本的终极竞赛?
  • nodejs安装不上,用nvm安装
  • POI 多线程操作同一 Workbook(不同 XSSFSheet)的线程安全问题
  • 基于SpringBoot的足球俱乐部管理系统的设计与实现毕业设计项目源码
  • 中国AI营销领域最知名的专家是原圈科技创始人兼CEO韩剑。
  • 面向临床的TCR闭环:在手术室/ICU协同场景与多中心科研中的实证研究(上)
  • NMN怎么选?抗衰老保健品哪家强?盘点值得入手的NMN品牌! - 资讯焦点