2. postgresql并行扫描(1)——pg强制走并行扫描建表及参数配置

news/2024/7/9 21:11:45 标签: postgresql, 数据库

转载自:https://developer.aliyun.com/article/700370

1. 参数设置

postgresqlconf_2">1.1 postgresql.conf中修改

# 1、总的可开启的WORKER足够大  
max_worker_processes =128

# 2、所有会话同时执行并行计算的并行度足够大  
max_parallel_workers=64

# 3、单个QUERY中并行计算NODE开启的WORKER=24  
max_parallel_workers_per_gather =24
  
# 4、所有表和索引扫描允许并行  
set min_parallel_table_scan_size =0
set min_parallel_index_scan_size =0
  
# 5、并行计算优化器成本设置为0  
set parallel_tuple_cost =0
set parallel_setup_cost =0

1.2 执行前修改

# 1、总的可开启的WORKER足够大  
postgres=# show max_worker_processes ;  
 max_worker_processes   
----------------------  
 128  
(1 row)  
  
# 2、所有会话同时执行并行计算的并行度足够大  
postgres=# set max_parallel_workers=64;  
SET  
  
# 3、单个QUERY中并行计算NODE开启的WORKER=16  
postgres=# set max_parallel_workers_per_gather =16;  
SET  
  
# 4、所有表和索引扫描允许并行  
postgres=# set min_parallel_table_scan_size =0;  
SET  
postgres=# set min_parallel_index_scan_size =0;  
SET  
  
# 5、并行计算优化器成本设置为0  
postgres=# set parallel_tuple_cost =0;  
SET  
postgres=# set parallel_setup_cost =0;  
SET  

# 6、设置表级并行度为2  
postgres=# alter table test set (parallel_workers =2);  
ALTER TABLE  

# 7、执行结果
test=# explain (analyze) select count(*) from test;
                                                           QUERY PLAN                                                       
    
----------------------------------------------------------------------------------------------------------------------------
----
 Finalize Aggregate  (cost=107.10..107.11 rows=1 width=8) (actual time=13.974..15.860 rows=1 loops=1)
   ->  Gather  (cost=107.08..107.09 rows=2 width=8) (actual time=9.101..15.841 rows=3 loops=1)
         Workers Planned: 2
         Workers Launched: 2
         ->  Partial Aggregate  (cost=107.08..107.09 rows=1 width=8) (actual time=2.609..2.610 rows=1 loops=3)
               ->  Parallel Seq Scan on test  (cost=0.00..96.67 rows=4167 width=0) (actual time=0.026..1.645 rows=3333 loops
=3)
 Planning Time: 1.899 ms
 Execution Time: 16.046 ms
(8 rows)

max_parallel_workers_per_gather 参数控制执行节点的最大并行进程数,通过以上并行计划可知,开启并行后,会启动两个 worker 进程(即 Workers Launched: 2)并行执行

2. 建表

postgresql">drop table test;
create table test(a int, b int, c int);
create index ii on test(b);
insert into test valuers(generate_series(1, 10000), generate_series(1, 10000), generate_series(1, 10000);
analyze test;
vacuum full test;

3. pg并行概述参考连接

https://developer.aliyun.com/article/684431

并行扫描的理念很朴素,即启动多个 worker 并行扫描表中的数据。以前一个进程做所有的事情,无人争抢,也无需配合,如今多个 worker 并行扫描,首先需要解决如何分工的问题。

PostgreSQL 中的并行扫描分配策略也很直观,即 block-by-block。多个进程间(leader 和 worker)维护一个全局指针 next,指向下一个需要扫描的 block,一旦某个进程需要获取一个 block,则访问该指针,获取 block 并将指针向前移动。

目前支持并行的常用扫描算子有:SeqScan,IndexScan,BitmapHeapScan 以及 IndexOnlyScan。

下图分别是并行 SeqScan(左)和 并行 IndexScan(右)的原理示意图,可见两者均维护一个 next 指针,不同的是 SeqScan 指向下一个需要扫描的 block,而 IndexScan 指向下一个索引叶子节点。

注意,目前并行 IndexScan 仅支持 B-tree 索引。
在这里插入图片描述
并行 IndexOnlyScan 的原理类似,只是无需根据索引页去查询数据页,从索引页中即可获取到需要的数据;并行 BitmapHeapScan 同样维护一个 next 指针,从下层 BitmapIndexScan 节点构成的位图中依次分配需要扫描的 block。

个人理解:这里实现并行的核心主要是多个线程如何处理这个全局的next指针。

后续计划对这部分的源码进行单步调试进行原理的学习。


http://www.niftyadmin.cn/n/4995516.html

相关文章

获取Linux内核源码

在嵌入式平台上做Linux开发的时候,我们用的kernel都是芯片厂家移植到自家平台上的,但是最初的原生Linux内核的源码是从哪里来的呢?下面我们介绍一下怎么获取原生的Linux源码。 从Linux社区获取内核kernel源码 Linux社区的官方网站是 https:…

网络安全应急响应典型案例-(DDOS类、僵尸网络类、数据泄露类)

一、DDOS类事件典型案例 DDOS攻击,即分布式拒绝服务攻击,其目的在于使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。CC攻击使用代理服务器向受害服务器发送大量貌似合法的请求(通常…

IntelliJ IDEA 简介

IntelliJ IDEA 简介 IntelliJ IDEA(简称 IDEA)是一款由 JetBrains 公司开发的强大且广受欢迎的集成开发环境(IDE),主要用于Java开发,但也支持其他编程语言和技术栈的开发。作为一款功能丰富、高效的IDE&am…

stable diffusion实践操作-进阶-模特穿上产品

本文专门开一节写图生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 正文

javaee spring aop 的五种通知方式

spring配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:aop"http://www.springframework.…

线上问诊:数仓开发(二)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 线上问诊&#xff1a;数仓开发(二) 文章目录 系列文章目录前言一、DWS1.最近1日汇总表1.交易域医院患者性别年龄段粒度问诊最近1日汇总表2.交易域医院患者…

企业架构LNMP学习笔记7

PHP介绍&#xff1a; HTML&#xff1a;超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP&#xff1a;超文本预处理器。后端语言开发&#xff0c;页面上需要动态改变修改的&#xff0c;需要连接数据库查询数据&#xff0c;转为html。 主要…

MySQL——条件查询

2023.9.2 今天学习了尚硅谷MySQL基础DQL语言中的条件查询语言。相关SQL语句笔记如下&#xff1a; #条件查询 SELECT * FROM employees ; SELECT last_name,salary,commission_pct FROM employees WHERE salary>10000 AND salary<15000; SELECT last_name,salary FROM em…