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

news2024/9/24 15:20:29

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_test
 USING 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_test
 USING 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, relpages
  FROM pg_class
 WHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx')
  ORDER BY relname;
  
        relname         | relpages 
------------------------+----------
 brin_test_parallel_idx |        3
 brin_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.coloradmin.cn/o/1920833.html

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

相关文章

Linux之文件fd

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.文件内容的回顾 二.提炼一下对文件的…

狂飙的鸭子,哪里跑!安定的力量(深度好文)——早读(逆天打工人爬取热门微信文章解读)

容我也来卖个小聪明,学习洞见,深度好文 引言Python 代码第一篇 洞见 安定的力量(深度好文)第二篇结尾 引言 老刺激了 骑着自行车在路上狂摇 刚刚好赶上打卡时间 早上一切很平和 听书 吃绿豆饼茶 做早餐 准点一天的排泄 老天估计…

快手矩阵系统:一键发布,多平台自动文案生成

在当今信息爆炸的时代,自媒体平台的崛起为用户提供了广阔的展示舞台。然而,对于内容创作者来说,如何高效地在多个平台上发布内容,同时保持文案的吸引力和独特性,一直是一个不小的挑战。幸运的是,随着技术的…

基于xinference推理引擎 + glm4-9b-chat模型的本地化部署探索

【备注】从langchain-chatchat v0.3开始,所有的模型配置,均由推理模型(如:xinference )进行加载和启动。 xinference 中配置并启动模型 1、查看支持的模型 xinference registrations --model-type LLM 2、执行tran…

相约 TDBC丨拓数派将亮相 2024 可信数据库发展大会!

2024 年,我国数据库正处于蓬勃发展期和关键应用期,在人工智能迅猛发展和数据要素市场化建设的浪潮下,为进一步推动全球数据库产业进步,2024 可信数据库发展大会将于 2024 年 7 月 16-17 日,在北京朝阳悠唐皇冠假日酒店…

计网ip层重要面经总结

文章目录 127.0.0.1, localhost, 0.0.0.0有什么不同?ipv6还需要NAT吗?DNS查询服务器的基本流程浏览器输入一个URL到显示器显示的过程PING是怎么工作的?ipv4和ipv6究竟有哪些区别?什么是跨域,什么情况下会发生跨域问题&#xff1f…

前端面试题42(MVVM与MVC区别)

MVVM(Model-View-ViewModel)和MVC(Model-View-Controller)都是软件架构模式,主要用于简化应用程序开发中的复杂性,尤其是在用户界面和数据管理方面。尽管它们有一些相似之处,但在设计理念和实施…

GD32MCU最小系统构成条件

大家是否有这个疑惑:大学课程学习51的时候,老师告诉我们51的最小系统构成?那么进入32位单片机时代,gd32最小系统构成又是怎么样的呢? 1.供电电路 需要确保供电的电压电流稳定,以东方红开发版为例&#xff…

基于深度学习的行人重识别

目录 1、基于表征学习的ReID方法 2、基于度量学习的ReID方法 (1)对比损失(Contrastive loss) (2)三元组损失(Triplet loss) (3) 四元组损失(Quadruplet loss) (4)难样本采样三元…

React+TS前台项目实战(三十)-- 首页构建之基于react-query和性能hook实现全页面数据渲染

文章目录 前言一、首页源码详细注释说明技术分析1. 页面功能分析2. 代码详细注释 二、效果展示总结 前言 前三篇文章详细介绍了首页的响应式布局,采用关注点分离进行模块拆解,现在只需按需引入模块,页面更加简洁,代码的维护性得到…

【鸿蒙学习笔记】关系型数据库概述

目录标题 关系型数据库的运行机制样例代码共通方法 DBUtilsIndex 代码效果 关系型数据库的运行机制 1、 关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图…

MongoDB教程(一):Linux系统安装mongoDB详细教程

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、Ubuntu…

【单片机毕业设计选题24059】-太阳能嵌入式智能充电系统研究

系统功能: 系统由太阳能电池板提供电源, 系统上电后显示“欢迎使用智能充电系统请稍后”, 两秒钟后进入主页面显示。 第一行显示太阳能电池板输入的电压值 第二行显示系统输出的电压值 第三行显示采集到的太阳能电池板温度 第四行显示设置的太阳能…

【Linux杂货铺】1.环境变量

1.环境变量基本概念 环境变量( environment variables )一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写 C / C +代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪…

信创会不会烂尾

最近又有不少人开始忽悠信创概念了,感觉这又是部分人发财的噱头,集体资源浪费的开始! 我们软件业几代人和全世界的差距能短时间内追上?人家会本着友谊第一比赛第二的原则,站在原地等你追?然后和你一起相扶到美好的未来&#xff1…

华为HCIP Datacom H12-821 卷37

1.多选题 下面关于Network- Summary-LSA 描述正确的是 A、Network- Summary-LSA中的Metric被设置成从该ABR到达目的网段的开销值 B、Network- Sumary-LSA中的Net mask 被设置成目的网段的网络掩码 C、Network- Summary-LSA 是由ASBR产生的 D、Network- Summary-LSA 中的Li…

年度必看|2024全球工业网络市场份额预测报告

重点摘要 每年,HMS Networks 都会对工业网络市场进行全面分析,旨在估计工厂自动化中按类型和协议划分的新连接节点的分布情况。最新研究表明,工业网络市场继续扩张,预计 2024 年将增长 7%。值得注意的是,工业以太网仍然…

python 实验八 数据分析与展示

一、实验目的 掌握掌握matplotlib库中pyplot模块的使用。 二、实验环境 Window10(x64),Python 3.8(x64),PyCharm Community Edition 2020.3.2(x64) 三、实验内容 现有列表hight…

WAV 和 FLAC 哪个音质好?常见音频格式又如何转换?

音频文件的格式种类繁多,每种格式都有其独特的优势和应用场景。其中,WAV 和 FLAC 作为两种常见的无损音频格式,备受音频发烧友和专业人士的青睐。它们不仅能够保留原始录音的全部细节,还为听众提供了近乎 CD 品质的听觉体验。然而…

文字转语音免费工具有哪些?嘎嘎好使的配音工具推荐

每天刷视频看多了大家随手创作的各种生活小段子,自己不免也心痒痒地想玩上一把,可奈何却搞不懂各种旁白配音怎么弄。 好在经过一番摸索之后,可算是被我整明白免费文字转语音该怎么操作了!接下来就把我搜集到的4款宝藏配音神器整理…