PostgreSQL——并行查询

这里写目录标题

  • 一、并行查询相关自己置参数
  • 二、并行扫描
    • 2.1、并行顺序扫描
    • 2.2、并行索引扫描
    • 2.3、并行index-only扫描
    • 2.4、并行bitmap heap扫描
  • 三、并行聚合
  • 四、多表关联
    • 4.1、Nested loop多表关联
    • 4.2、Merge join多表关联
    • 4.3、Hash join多表关联

了解 Oracle 的朋友应该知道 Oracle 支持并行查询,比如 SELECT 、 UPDATE 、 DELETE大事务开启并行功能后能利用多核 CPU ,从而充分发挥硬件性能,提升大事务处理效率,PostgreSQL 在 9.6 版本前还不支持并行查询, SQ L 无法利用多核 CPU 提升性能, 9.6 版本开始支持并行查询,只是 9.6 版本的并行查询所支持的范围非常有限,例如只在顺序扫描、多表关联、聚合查询中支持并行, 10 版本增强了并行查询功能,例如增加了并行索引扫描 、并行 index-only 扫描、并行 bitmap heap 扫描等。

一、并行查询相关自己置参数

  1. max_worker_processes(integer)
    设置系统支持的最大后台进程数,默认值为 8 ,如果有备库,备库上此参数必须大于或等于主库上的 此参数配置值, 此参数调整后需重启数据库生效 。
  2. max_parallel_workers (integer)
    设置系统支持的并行查询进程数,默认值为 8 ,此参数受 max_worker_processes 参数限制,设置此参数的值比 max_worker processes 值高将无效 。当调整这个参数时建议同时调整 max_parallel workers _per _gather 参数值 。
  3. max_parallel_workers_per _gather (integer)
    设置允许启用的并行进程的进程数,默认值为 2 ,设置成 0 表示禁用并行查询,此参数受 max_worker_processes 参数和 max_parallel_workers 参数限制,因此并行查询的实际进程数可能比预期的少,并行查询比非并行查询消耗更多的 CPU 、 IO 、内存资源,对生产系统有一定影 响 , 使用时需考虑这方面的因素,这三个参数的配置值大小关系通常如下所示:
max_worker_processes > max_parallel_workers > max_parallel_workers p er_gather
  1. parallel_setup_cost(floating point)
    设置优化器启动并行进程的成本 ,默认为 1000 。
  2. parallel_tuple_cost(floating point)
    设置优化器通过并行进程处理一行数据的成本,默认为 0.1 。
  3. mi n_pa ra I lel_ta ble_sca n_size(integer)
    设置 开启并行的 条件之一 , 表 占用 空 间小于此值将不会开启并行,并行顺序扫描场景下扫描的数据大小通常等于表大小 , 默认值为 8MB 。
  4. min_parallel_index_scan_size(integer)
    设置开启 并行的 条件之一,实 际上并行索引扫描不会扫描索引所有数据块,只是扫描索引相关数据块,默认值为 512kb 。
  5. force_parallel_mode (enum)
    强制开启并行, 一般作为测试目的, OLTP 生产环境开启需慎重,一般不建议开启 。

postgresql.conf 配置文件设置了以下参数:

max_worker_processes = 16
max_parallel_workers_per_gather = 4  		# taken from max_parallel_workers
max_parallel_worders = 8
parallel_tuple_cost = 0.1
parallel_setup+cost = 1000.0
min_parallel_table_scan_size = 8MB
min_parallel_index_scan_size = 612kb
force_parallel_mode = off

行查询进程 数 预估值由 ~ 4&. max_parallel workers_per_阴阳控制,并行进程数预估值是指优化器解析 SQL 时执行计划预计会启用的并行进程数,而实际执行查询时的并行进程数受参数 max_parallel_ workers 、 max_worker_processes 的限制,也就是说 SQL 实际获得的并行进程数不会超过这两个参数设直的值,比如 max worker_processes 参数 设直成 2, max_parallel_workers_per_gather 参数设直成 4 ,不考虑其他因素的情况下,并行查询实际的并行进程数将会是 2 ,另一方面并行进程数据会受 min_parallel_table _scan_size 参数 的影响, flf 表的大小会影响并行进程数 。 并行查询执行计划中的 Workers Planned 表示执行计划预估的并行进程 数 , Worker Launched 表示并行查询实际获得的并行进程数 。

二、并行扫描

2.1、并行顺序扫描

介绍并行顺序扫描之前先介绍顺序扫描(sequential scan),顺序扫描通常也称之为扫描,全表扫描会扫描整张表数据,当表很大时,全表扫描会占用大量CPU、内存、源,对数据库性能有较大影响,在OLTP事务型数据库系统中应当尽量避免。
首先创建一张测试表,井插入500万数据,如下所示:

create table test_big1 (id int4,name character varying(32),create_time timestamp without time zone default clock_timestamp()
);insert into test_big1(id, name)
select n, n || '_test' 
from generate_series(1, 50000000) n;

一个顺序扫描的示例如下所示:

explain select *
from test_big1
where name = '1_test';

在这里插入图片描述

以上执行计划Seq Scan on test_bigl说明表test_bigl典型的顺序扫描执行计划,PostgreSQL中的顺序扫描在9.6
上进行了顺序扫描,这是版本开始支持并行处理,一个典
并行顺序扫描会产生多个子进程,井利用多个逻辑CPU
并行全表扫描,一个并行顺序扫描的执行计划如下所示:

explain analyze select *
from test_big1
where name = '1_test';

在这里插入图片描述

Workers Planned 表示执行计划预估的并行进程数,
Worker Launched 表示查询实际获得的并行进程数,这里 Workers PlannedWorker Launched值都为 4 , Parallel Seq Scan on test_ big 1 表示进行了并行顺序扫描, Planning time 表示生成执行计划的时间, Execution time 表示 SQL 实际执行时间,从以 上可 以 看出, 开启 4 个并行时 SQL 实际执行时间为 1367 毫秒。

接下来测试不开启并行的 SQL 性能,由于 max_parallel_workers_per_gather 参数设置成了 4 , 设置成 0 表示关闭并行,在会话级别设置此参数值为 0 ,如下所示 :

set max_parallel_workers_per_gather = 0;

不开启并行,执行计划如下所示 :

explain analyze select *
from test_big1
where name = '1_test';

在这里插入图片描述

不开启并行时此 SQL 执行时间为50463毫秒,开启井行查询为32499毫秒。

2.2、并行索引扫描

Index Scan using 表示 执行计划预计进行索引扫描, 索 引扫描也支持并行,称为并行索引扫描 ( Parallel index scan ), 首 先在表 test_bigl 上创建索引, 如下所示 :

create index idx_test_big1_id 
on test_big1 using btree (id);

执行以下SQL,统计ID小于1千万的记录数,如下所示:

explain analyze select count(name)
from test_big1
where id < 10000000;

在这里插入图片描述

根据以上执行计划可以看出,进行了并行索引扫描,开启了2个并行进程,在会话级别关闭并行查询,如下所示:

SET max_parallel_workers_per_gather = 0;explain analyze select count(name)
from test_big1
where id < 10000000;

在这里插入图片描述

执行计划看出进行了索引扫描,没有开启并行。

2.3、并行index-only扫描

了解并行 index-only 扫描之前首先介绍下index-only扫描,顾名思义,index-only扫描是指只需扫描索引,也就是说SQL 仅根据索引就能获得所需检索 的 数据,而不需要通过索引回表查询数据 。 例如 ,使用SQL统计ID小于100万的记录数,在开始测试之前,先在会话级别关闭 并行, 如下所示:

SET max_parallel_workers_per_gather = 0;explain select count(*)
from test_big1
where id < 10000000;

在这里插入图片描述

上执行计划主要看Index Only Scan这一 行 ,由于ID宇段上建 立了索引,统计记录数不需要再回表查询其他信息,因此进行了index-only扫描,接下来使用EXPLAIN ANALYZE执行此SQL,如下所示:

explain analyze select count(*)
from test_big1
where id < 10000000;

在这里插入图片描述

index-only 扫描支持并行,称为并行 index-only 扫描,接着测试并行 index-only扫描,在会话级别开启并行功能,如下所示 :

SET max_parallel_workers_per_gather to default;explain analyze select count(*)
from test_big1
where id < 10000000;

在这里插入图片描述

上执行计划主要看 Parallel Index Only Scan 这段 ,进行了并行 index-only 扫描。

2.4、并行bitmap heap扫描

绍并行 bitmap heap 扫描之前先了解下 Bi tmap Index 扫描和 Bitmap Heap 扫描, 当 SQL的where 条件中出现or时很有可能出现 Bitmap Index 扫描 , 如下所示 :

explain select *
from test_big1
where id = 1 or id = 2;

在这里插入图片描述

从以上执行计划看出,首先执行两次 Bitmap Index 扫描 获取索 引项,之后将 Bitmap Index扫描获取的结果合起来回表查 询 ,这时在表test_bigl 上进行了Bitmap Heap 扫描 。

Bitmap Heap 扫描也支持并行,执行以下 SQL ,在查询条件中将 ID 的选择范围扩大。

explain analyze select count(*)
from test_big1
where id < 1000000 or id > 49000000;

在这里插入图片描述

会话级关闭并行查询,如下所示:

set max_parallel_workers_per_gather = 0;explain analyze select count(*)
from test_big1
where id < 1000000 or id > 49000000;

在这里插入图片描述

三、并行聚合

合操作是指使用 count() 、 sum() 等聚合函数 的 SQL ,以下执行 count ()函数统计表记录总数,执行计划如下所示 :

explain analyze select count(*)
from test_big1;

在这里插入图片描述

从以上执行计划 看 出, 首先进行 Part i al Aggregate , 开 启了 四个 并 行进程, 最后进行Finalize Aggregate。

这个例子充分验证 了聚合查询 count ()能 够支持并行 , 为 了 初 步测试并行性能,在会话级别关闭并行查询,如下所示 :

set max_parallel_workers_per_gather = 0;explain analyze select count(*)
from test_big1;

在这里插入图片描述

不同并行进程数下的全表扫描执行时间:
在这里插入图片描述

四、多表关联

4.1、Nested loop多表关联

多表关联 Nested loop 实际上是一个嵌套循环, 伪代码如下所示 :

for	(i = 0; i < length(outer); i++)for (j = 0; j < length(inner); j++)if (outer[i] == inner[j])output(outer[i], inner[j]);

接着 测试 Nested loop 多表关联场景 下使用到并行扫描 的情况,创建一张 test_small 小表,如下所示 :

create table test_small(id int4,name character varying(32)
);insert into test_small(id, name)
select n, n || '_small' 
from generate_series(1, 800000) n;

ANALYZE 命令用于收集表上的统计信息,使优化器能够获得更准确的执行计划,两表关联执行计划如下所示 :

explain analyze select test_small.name
from test_big1, test_small
where test_big1.id = test_small.id and test_small.id < 10000;

在这里插入图片描述

从以上执行计划可以 看出,首先在表 test_bigl 上进行 了 Index Only 扫描,用于检索 id 小于 10000 的记录,之后两表进行 Nested loop 关联同时在表 test_small I 上进行了并行 Bitmap Heap 扫描,用于检索 id 小于 10000 的记 录。

4.2、Merge join多表关联

Merge join 多表关联首先将两个表进行排序,之后进行关联宇段匹配 , Merge join 示例如下所示:

explain analyze select test_small.name
from test_big1, test_small
where test_big1.id = test_small.id
and test_small.id < 200000;

在这里插入图片描述

4.3、Hash join多表关联

ostgreSQL 多表关联也支持 Hash join , 当关联宇段没有索引情况下两表关联通常会进行 Hash join ,接 下 来查看 Hash join 的执行计划 ,先将两张表上 的索引删除,同时关闭并行,如下所示:

drop index idx_test_big1_id;drop index idx_test_small_id;explain analyze select test_small.name
from test_big1 join test_small
on test_big1.id = test_small.id and test_small.id < 100;

在这里插入图片描述

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

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

相关文章

智能体赋能金融多模态报告自动化生成:技术原理与实现流程全解析

在金融领域&#xff0c;研报作为决策参考的核心载体&#xff0c;其生成过程往往涉及海量数据采集、多维度分析及专业内容整合&#xff0c;传统人工制作模式不仅耗时耗力&#xff0c;还难以满足实时性与标准化需求。随着人工智能技术的发展&#xff0c;“智能体赋能的金融多模态…

uniapp和vue3项目中引入echarts 、lime-echart(微信小程序、H5等)

目录标题1、获取 lime-echart插件2、安装 echarts3、相关代码4、在线定制5、效果截图1、获取 lime-echart插件 https://gitee.com/liangei/lime-echart 将其中组件和静态资源分别放入当前项目对应的文件夹中&#xff1a; 2、安装 echarts npm install echarts --save具体查…

ZYNQ7020+AD9361裸机驱动验证

1. 程序编译验证 a. 下载源代码 首先需要从GitHub下载相应的源码&#xff0c;打开git bash&#xff0c;然后在mingwin中使用以下命令下载源码。 git clone --recursive https://github.com/MicroPhase/antsdr_standalone.git 注意&#xff1a;在下载源码的时候&#xff0c;使…

Grafana配置连接时候证书与mongosqld启动证书的关系

目录 证书角色说明 1. BI Connector 端的证书 (--sslPEMKeyFile) 2. Grafana 端的证书 (TLS/SSL Client Certificate & Key) 它们之间的关系 配置建议 情况一&#xff1a;只需要服务器验证&#xff08;最常见&#xff09; 情况二&#xff1a;需要双向SSL认证&#x…

解决HTML/JS开发中的常见问题与实用资源

在前端开发过程中&#xff0c;即使是经验丰富的开发者也会遇到各种小问题。本文将聚焦于两个常见问题的解决方案&#xff0c;并推荐一些国内可访问的优质源码学习网站&#xff0c;帮助开发者提升效率。 一、字符编码与乱码问题解决 在HTML和JavaScript开发中&#xff0c;字符编…

SQLI-labs[Part 2]

本篇为SQLI-labs的Write-Up的第二部分包含Level 23- Level 27Level 23 过滤注释符 字符注入拼接语句发现注释符没有生效 应该是被过滤了那只能通过拼接语句来除去后面的影响拼接?id1 or 11?id1%27%20or%20%271%27%271源码中最后的导致语句闭合 Level 24 字符二次注入成功登录…

宋红康 JVM 笔记 Day17|垃圾回收器

一、今日视频区间 P169-P203 二、一句话总结 GC分类与性能指标&#xff1b;不同的垃圾回收器概述&#xff1b;Serial回收器&#xff1a;串行回收&#xff1b;ParNew回收器&#xff1a;并行回收&#xff1b;Parallel回收器&#xff1a;吞吐量优先&#xff1b;CMS回收器&#xff…

[硬件电路-194]:NPN三极管、MOS-N, IGBT比较

NPN三极管、MOS-N&#xff08;N沟道MOS管&#xff09;和IGBT&#xff08;绝缘栅双极型晶体管&#xff09;在电子电路设计中各有其独特的应用场景和优势&#xff0c;以下从工作原理、特性、应用领域三个维度进行比较&#xff1a;工作原理NPN三极管&#xff1a;结构&#xff1a;由…

【代码随想录day 25】 力扣 46. 全排列

视频讲解&#xff1a;https://www.bilibili.com/video/BV19v4y1S79W/?vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解&#xff1a;https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html#%E6%80%9D%E8%B7%AF 力扣题目&#xff1a;https://leetcode.cn/prob…

指针(五)后半

1、 qsort 函数1.1、qsort 函数排列结构体在这里&#xff0c;我们创建结构体类型的数组&#xff0c;用于 qsort 函数的传参。#include<stdio.h> #include<stdlib.h> #include<string.h>struct Stu//创建结构体变量 {char name[30];int age; };struct Stu arr…

TDengine 特殊选择函数 MODE() 用户手册

MODE 函数用户手册 函数定义 MODE(expr)功能说明 MODE() 函数返回指定列中出现频率最高的值&#xff08;众数&#xff09;。如果有多个值具有相同的最高频率&#xff0c;系统会返回其中一个值。该函数会忽略 NULL 值。 算法原理 MODE 函数的计算过程如下&#xff1a; 数据…

智能外骨骼技术应用场景及价格可接受区间分析

一、引言 智能外骨骼机器人融合机械、人工智能和传感器技术,增强或恢复人体运动能力。2025年,该技术在医疗康复、工业生产、军事应用和消费市场快速普及。本文分析其应用场景、市场需求、典型产品、价格可接受区间及相关来源,探讨普及的关键因素。 二、主要应用场景及产品…

Vue模板中传递对象或数组时,避免直接使用字面量[]和{}

在 Vue 中&#xff0c;直接在模板中使用 [] 或 {} 作为 prop 值会导致子组件不必要的重新渲染&#xff0c;因为每次父组件渲染时都会创建新的引用。以下是解决方案和最佳实践&#xff1a; 1. 避免在模板中直接使用字面量 <!-- 避免这样写 --> <ChildComponent :items&…

【C++】list容器的模拟实现

目录 1. 节点(list_node) 的结构 2. 哨兵位头节点 3. list容器的成员变量 4. 插入/删除操作 4.1 插入操作&#xff08;insert&#xff09; 4.2 删除操作&#xff08;erase&#xff09; 5. 迭代器的实现 6. 不同迭代器和const容器的限制 7. 重载operator-> 8. 迭代器…

三大运营商eSIM手机业务开通加速

截至2025年9月11日&#xff0c;中国三大运营商eSIM手机业务开通情况呈现明显差异化&#xff1a;中国联通已率先支持eSIM手机业务&#xff0c;但仅限于特定城市和设备&#xff1b;中国移动和中国电信则处于"技术准备就绪&#xff0c;等待政策批复"阶段&#xff0c;预计…

基于SpringBoot的足球论坛系统+论文示例参考

1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;用户管理、足球赛事、球员信息、推荐话题、帖子信息、周边商城、订单信息、系统管理等技术选型&#xff1a;SpringBoot&#xff0c;Vue等 测试环境&#xff1a;idea2024&#xff0c;jdk1.8&#xff0c;mys…

数据库中悲观锁小结

实际上&#xff0c;悲观并发控制实际上是“先取锁再访问”的保守策略&#xff0c;为数据处理的安全提供了保证。但是在效率方面&#xff0c;处理加锁的机制会让数据库产生额外的开销&#xff0c;还有增加产生死锁的机会&#xff1b;另外&#xff0c;在只读型事务处理中由于不会…

结构光三维重建原理详解(1)

1. 基本原理概述 结构光三维重建&#xff08;Structured Light 3D Reconstruction&#xff09;是一种主动式光学测量方法。其核心思想是&#xff1a; 向物体表面投射一组 已知的、编码好的光栅/条纹图案&#xff1b;使用一个或多个摄像机拍摄这些条纹在物体表面的变形情况&…

TruckSim与Matlab-Simulink联合仿真(一)

摘要 从0到1的TruckSim与Matlab-Simulink 简单的联合仿真。 1. 环境搭建 matlab版本&#xff1a;R2022a TruckSim版本&#xff1a;2019 其他适配版本自行搜索。 matlabR2022a安装参考&#xff1a;参考链接 TruckSim2019安装包百度网盘链接&#xff0c;里面有安装流程&#x…

后端post请求返回页面,在另一个项目中请求过来会出现的问题

目录 1.后端post请求返回页面&#xff0c;跨域问题 一、核心问题&#xff1a;跨域&#xff08;CORS&#xff09;限制&#xff08;最直接的技术障碍&#xff09; 具体表现&#xff1a; 二、安全性问题&#xff1a;CSRF 攻击风险被放大 原理与危害&#xff1a; 三、交互体验…