PostgreSQL17索引优化之支持并行创建BRIN索引

PostgreSQL17索引优化之支持并行创建BRIN索引

最近连续写了几篇关于PostgreSQL17优化器改进的文章,其实感觉还是挺有压力的。对于原理性的知识点,一方面是对这些新功能也不熟悉,为了尽可能对于知识点表述或总结做到准确,因此需要去阅读官网的讨论邮件及源码;另外对于知识点,如何快速的把自己写文章的本意,很清晰的表达清楚,也在不断调整写作方式。希望不会对大家的阅读造成困扰,也希望大家有所收获。

关于PostgreSQL17索引优化之支持并行创建BRIN索引这个主题,相对来说更倾向于实操类型的,对于底层具体是如何实现的,其实对于大部分人来说应该是不太关注。下面我们直接进入正题,直接实操验证该功能。

创建测试用例表并插入数据

CREATE TABLE brin_parallel_test (a int, b text, c bigint) WITH (fillfactor=40);
--生成的数据中需要有null或非null的值
INSERT INTO brin_parallel_test
SELECT (CASE WHEN (mod(i,231) = 0)  THEN NULL ELSE i END),(CASE WHEN (mod(i,233) = 0) THEN NULL ELSE md5(i::text) END),(CASE WHEN (mod(i,233) = 0)  THEN NULL ELSE (i/100) + mod(i,8) END)FROM generate_series(1,50000000) S(i);

串行创建BRIN索引

查看max_parallel_maintenance_workers默认参数值

查看max_parallel_maintenance_workers,该参数设置单一工具性命令能够启动的并行工作者的最大数目。默认值2,表示条件允许,可以启动两个工作程序来帮助创建索引。

testdb=# show max_parallel_maintenance_workers;max_parallel_maintenance_workers 
----------------------------------2
(1 row)

设置max_parallel_maintenance_workers值

为了确保不会选择多核创建索引,在这里将max_parallel_maintenance_workers设置为0

SET max_parallel_maintenance_workers = 0;

创建BRIN索引

 CREATE INDEX brin_test_serial_idx ON brin_parallel_testUSING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops)WITH (pages_per_range=7);
CREATE INDEX
Time: 52435.488 ms (00:52.435)

在这里插入图片描述

并行创建BRIN索引

设置并行参数及maintenance_work_mem

SET min_parallel_table_scan_size = 0;
SET max_parallel_maintenance_workers = 4;
SET maintenance_work_mem = '128MB';

创建BRIN索引

 CREATE INDEX brin_test_parallel_idx ON brin_parallel_testUSING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops)WITH (pages_per_range=7);
CREATE INDEX
Time: 12246.050 ms (00:12.246)

在这里插入图片描述

对比串行和并行串行索引是否一致

SELECT relname, relpagesFROM pg_classWHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx')ORDER BY relname;relname         | relpages 
------------------------+----------brin_test_parallel_idx |        3brin_test_serial_idx   |        3
(2 rows)
--检查(A except B)和(B except A)是否为空,如果为空,这意味着索引是相同的。
SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx')
EXCEPT
SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx');SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx')
EXCEPT
SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx');

从这里我们可以看出,对于串行和并行创建的索引,其结果是一致的。

总结

从上述的验证,在串行创建BRIN索引,耗时52.435s,并行创建BRIN索引,耗时12.246s,性能大幅提升。对于并行创建BRIN索引,当max_parallel_maintenance_workers为4时,通过观察后台的进程,是由一个主进程和3个辅助进程来创建索引的。

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

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

相关文章

华为认证试题有题库吗?华为认证题库怎么领取?

在竞争激烈的就业环境下,若你拥有华为认证将可以提高个人综合能力,更好的适应行业变化。相信大家都有听说过想考取华为初级认证并不困难,因为它有专门的题库供考生备考。 那么,到底华为认证试题有题库吗?华为认证题库要怎么领取…

java并发编程之美-第1章 并发编程线程基础-线程的创建与运行

文章目录 1.什么是线程2. 线程创建和运行 1.什么是线程 进程是操作系统进行资源分配和调度的基本单位,线程是 CPU 分配的基本单位。 程序计数器用来记录线程当前要执行的指令地址。CPU一般是使用时间片轮转方式让线程轮询占用的,程序计数器是记录线程…

【Django】报错‘staticfiles‘ is not a registered tag library

错误截图 错误原因总结 在django3.x版本中staticfiles被static替换了,所以这地方换位static即可完美运行 错误解决

callBack方式实现threejs点击事件Raycaster

我用的的示例类发方式来初始化场景。 类里面定义点击方法。 initMouse(fun) {window.addEventListener("click", (event) > {this.clickObject(event, fun);});}// 鼠标事件clickObject(event, fun) {// 计算点击位置的归一化设备坐标const mouse new THREE.Ve…

IO模型理论学习

1、什么是IO 计算机视角下的io AIO

“泰迪·曲靖师范学院数学与统计学院数据科学教学实训平台”工作室签约揭牌仪式圆满结束

为深化校企合作,实现应用型人才培养目标。泰迪智能科技携手曲靖师范学院数学与统计学院共建“数据科学教学实训平台工作室”。 2024年7月10日,“‌泰迪数学与统计学院数据科学教学实训平台”工作室揭牌仪式在曲靖师范学院举行。泰迪智能科技昆明分公司院…

LPRNet 车牌识别部署 rk3588(pt-onnx-rknn)包含各个步骤完整板端代码

虽然车牌识别技术很成熟了,但完全没有接触过。一直想搞一下、整一下、试一下、折腾一下,工作之余找了一个简单的例子入个门。本博客简单记录一下 LPRNet 车牌识别部署 rk3588流程,训练参考 LPRNet 官方代码。 1、导出onnx   导出onnx很容易…

SW - 将面导出为dxf

文章目录 SW - 将面导出为dxf概述笔记原点问题END SW - 将面导出为dxf 概述 在做PCB板框. 以前做过一个笔记,用autoCAD来制作导出dxf(cadence SPB17.4 - 用autoCAD2022画一个PCB板框)。 不喜欢用autoCAD(相对麻烦), 还是喜欢用SW&#xff0…

异步日志:性能优化的金钥匙

一、背景 2024 年 4 月的一个宁静的夜晚,正当大家忙完一天的工作准备休息时,应急群里“咚咚咚”开始报警,提示我们余利宝业务的赎回接口成功率下降。 通过 Monitor 监控发现,该接口的耗时已经超过了网关配置的超时阈值(2s)&#…

Spring Cloud Alibaba整合Seata实战

Spring Cloud Alibaba整合Seata实战 1.启动Seata Server 1.1 环境准备 1)指定nacos作为配置中心和注册中心 修改registry.conf文件 注意:客户端配置registry.conf使用nacos时也要注意group要和seata server中的group一致,默认group是&quo…

Linux--生产消费模型

线程系列: Linux–线程的认识(一) Linux–线程的分离、线程库的地址关系的理解、线程的简单封装(二) 线程的互斥:临界资源只能在同一时间被一个线程使用 生产消费模型 生产消费模型是多线程编程和分布式系统中的一个经典概念&…

我们水冷使制动电阻功率密度成倍增加-水冷电阻设计工厂

先进陶瓷 我们后来发现工业应用中对占用空间最小的水冷电阻器的工业需求,推出了适用于中压工业应用的水冷电阻器。它的特点是两块由具有特殊性能的先进陶瓷制成的板。 使用工业电驱动装置的一个重要好处是,可靠的再生和动态制动系统可以补充或取代传统…

Laravel :如何将Excel文件导入数据库

文章目录 一、前提二、使用2.1、新建一个导入文件2.2、新建一个控制器和方法,调用导入文件2.3、 新建一个页面,支持文件上传 一、前提 想要将excel内容入库,laravel有扩展可以使用,常用的扩展是maatwebsite/excel,安装步骤参考上一篇&#x…

Mosh|SQL教程第四弹(未完)

SQL有很多自带的内聚的函数(MAX、MIN、AVG、SUM、COUNT) 一、聚合函数(Aggregate Functions) 这里的括号可以写列名也可以写表达式,下面是一个练习: 二、GROUP BY子句 统计2019-07-01以后每个客户的总销售额 注意这…

Javaweb11-Filter过滤器

Filter过滤器 1.Filter的基本概念: 在Java Servlet中,Filter接口是用来处理HttpServletRequest和HttpServletResponse的对象的过滤器。主要用途是在请求到达Servlet之前或者响应离开Servlet之前对请求或响应进行预处理或后处理。 2.Filter常见的API F…

探展2024世界人工智能大会之合合信息扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的大模型加速器⭐️ 结语 ⭐️ 前言 大家好,我是 哈哥(哈哥撩编程) ,这次非常荣幸受邀作为专业观众参…

重磅!新公司法正式实施,这些变化你必须知道! ️

新公司法来了!企业设立和经营必知的关键变动 🏛️🚀 大家好,我是猫头虎,科技自媒体博主。今天我们来聊聊一件大事——新公司法的实施,这对企业设立和经营带来了哪些重大影响?跟着我&#xff0c…

【DDIM】DENOISING DIFFUSION IMPLICIT MODELS【论文精读】【视频讲解】【公式推导】

论文:DENOISING DIFFUSION IMPLICIT MODELS(https://arxiv.org/abs/2010.02502) B站视频链接 DDIM论文精讲视频 去噪扩散隐模型的论文精读,涉及本文的大部分公式逐步推导。总计3小时的详细论文讲解。 讲解详细对应文档 DDIM视频…

聊聊mysql

记录那些坑 本文会持续更新,陆续更新有关mysql技术内幕、实战优化、面试技巧。 文章目录 前言索引BTree之聚集索引BTree之辅助索引BTree之联合索引BTree之覆盖索引 使用到的工具1、py_innodb_page_info工具2、hexdump工具 总结 前言 重中之重的MySql数据库 mysql…

概率论期末速成(知识点+例题)

考试范围 一: 事件关系运算性质全概率公式、贝叶斯公式古典概型 二: 离散分布律连续密度函数性质 -> 解决三个问题(求待定系数、求概率、求密度函数)分布函数 -> 解决三个问题常用分布(最后一节课的那几个分…