PostgreSQL17优化器改进(3)在使用包含操作符<@和@>时优化范围查询

PostgreSQL17优化器改进(3)在使用包含操作符<@和@>时优化范围查询

本文将介绍PostgreSQL 17服务端优化器在使用包含操作符<@和@>时优化范围查询。其实在在第一眼看到官网网站的对于该优化点的时候,可能是由于缺乏对于范围类型的认知,因此也不太清楚具体优化的场景,但是通过详细的阅读官网沟通邮件及官网文档,也基本搞明白了PostgreSQL17 的优化场景。下面是整理的功能测试用例及不支持的场景的测试用例。

创建测试用例需要的表

CREATE TABLE rang_integer (num integer);
insert into rang_integer  select generate_series(-100000, 100000);
CREATE index idx_rang_integer ON rang_integer( num );
ANALYZE rang_integer;

PostgreSQL16.3中的执行计划

在PostgreSQL16.3中,测试用例将对比BETWEEN and语句和范围操作符@>、@< 的执行计划和执行用时。

testdb=> EXPLAIN ANALYZE SELECT num FROM rang_integer WHERE num BETWEEN -10 AND 8;QUERY PLAN                                                              
--------------------------------------------------------------------------------------------------------------------------------------Index Only Scan using idx_rang_integer on rang_integer  (cost=0.42..4.80 rows=19 width=4) (actual time=0.470..0.475 rows=19 loops=1)Index Cond: ((num >= '-10'::integer) AND (num <= 8))Heap Fetches: 0Planning Time: 0.191 msExecution Time: 0.502 ms
(5 rows)Time: 1.721 ms
testdb=> 
testdb=> 
testdb=> EXPLAIN ANALYZE SELECT num FROM rang_integer WHERE num <@ int4range(-10, 8);QUERY PLAN                                                   
---------------------------------------------------------------------------------------------------------------Seq Scan on rang_integer  (cost=0.00..3385.01 rows=1000 width=4) (actual time=17.626..36.529 rows=18 loops=1)Filter: (num <@ '[-10,8)'::int4range)Rows Removed by Filter: 199983Planning Time: 0.113 msExecution Time: 36.552 ms
(5 rows)Time: 37.285 ms

在PostgreSQL16.3版本中检查一个元素是否包含在一个范围中时,使用@>或<@操作符的性能比BETWEEN AND的查询性能都差且差距比较大;通过执行计划我们也可以看出,在使用范围操作符时,扫描方式使用的是Seq Scan on rang_integer ,未使用到范围过滤条件上的索引。

PostgreSQL17.0Beta 1中的执行计划

在PostgreSQL17中,同样测试用例将对比BETWEEN and语句和范围操作符@>、@< 的执行计划和执行用时。

testdb=> EXPLAIN ANALYZE SELECT num FROM rang_integer WHERE num BETWEEN -10 AND 8;QUERY PLAN                                                              
--------------------------------------------------------------------------------------------------------------------------------------Index Only Scan using idx_rang_integer on rang_integer  (cost=0.42..4.84 rows=21 width=4) (actual time=0.281..0.286 rows=19 loops=1)Index Cond: ((num >= '-10'::integer) AND (num <= 8))Heap Fetches: 0Planning Time: 0.192 msExecution Time: 0.315 ms
(5 rows)Time: 1.205 ms
testdb=> 
testdb=> ^C
testdb=> EXPLAIN ANALYZE SELECT num FROM rang_integer WHERE num <@ int4range(-10, 8);QUERY PLAN                                                              
--------------------------------------------------------------------------------------------------------------------------------------Index Only Scan using idx_rang_integer on rang_integer  (cost=0.42..4.82 rows=20 width=4) (actual time=0.034..0.039 rows=18 loops=1)Index Cond: ((num >= '-10'::integer) AND (num < 8))Heap Fetches: 0Planning Time: 0.207 msExecution Time: 0.061 ms
(5 rows)Time: 0.794 ms

在PostgreSQL17版本中,优化范围值的查询后,通过对比 PostgreSQL16.3和PostgreSQL17的范围操作符查询,执行耗时由原来的37.285ms降低到0.794 ms,执行SQL的耗时大概提升了40倍多。我们再查看PostgreSQL17版本中的执行计划,发现在使用范围操作符时过滤数据时,已经用到之前新建的索引idx_rang_integer,因此查询才得到了提升。

PostgreSQL17.0Beta 1中不支持的场景

检查可变用例是否优化

这些用例是官网文档中提供的,通过下面的测试可知,对于值可变的情况,未进行优化

testdb=> select now();now              
-------------------------------2024-06-11 17:06:07.074701+08
(1 row)Time: 0.331 ms
testdb=> explain (verbose, costs off)
testdb-> select now() <@ tstzrange('2024-06-10 00:00', '2024-06-20 00:00');QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------ResultOutput: ((now() >= '2024-06-10 00:00:00+08'::timestamp with time zone) AND (now() < '2024-06-20 00:00:00+08'::timestamp with time zone))
(2 rows)Time: 0.610 ms
testdb=> explain (verbose, costs off)  -- unsafe!
testdb-> select clock_timestamp() <@ tstzrange('2024-06-10 00:00', '2024-06-20 00:00');QUERY PLAN                                             
---------------------------------------------------------------------------------------------------ResultOutput: (clock_timestamp() <@ '["2024-06-10 00:00:00+08","2024-06-20 00:00:00+08")'::tstzrange)
(2 rows)Time: 0.532 ms
testdb=> explain (verbose, costs off)
testdb-> select clock_timestamp() <@ tstzrange('2024-01-20 00:00', NULL);QUERY PLAN                                      
-------------------------------------------------------------------------------------ResultOutput: (clock_timestamp() >= '2024-01-20 00:00:00+08'::timestamp with time zone)
(2 rows)Time: 0.714 ms

总结

在PostgreSQL 17中为范围操作符<@和@>添加优化器支持函数,这些支持函数将优化具有恒定范围值的表达式转换为对范围边界值的直接比较,其实就是启用了过滤条件上的索引。但是,有些情况也是不支持的,如果对可变的或代价高的元素表达式进行双重求值,则跳过该转换。

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

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

相关文章

TCP和UDP区别

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;和UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;都是Internet协议套件中的传输层协议&#xff0c;但它们在工作方式、特性和适用场景上有显著区别&#xff…

比 Safari 阅读模式更强大的阅读助手

一、简介 1、一款专为浏览器设计的扩展程序&#xff0c;旨在提供更为简洁、高效的网页阅读体验。它能够对网页内容进行智能提取和排版&#xff0c;自动屏蔽广告和噪音&#xff0c;使读者能够专注于网页的核心内容。此外&#xff0c;Circle 阅读助手还具备多种个性化功能&#x…

提升员工安全意识的重要性!

提升网络安全意识的重要性 提升网络安全意识对于个人和组织来说至关重要&#xff0c;原因如下&#xff1a; 人为错误是网络安全漏洞的主要原因&#xff1a;据估计&#xff0c;95%的网络安全漏洞都是由人为错误造成的。这表明&#xff0c;即使拥有最高级的技术防护&#xff0c;…

Scala学习笔记11: 操作符

目录 第十一章 操作符1- 标识符2- 中置操作符3- 一元操作符4- 赋值操作符5- 操作符的优先级6- 结合性7- apply和update方法8- 提取器end 第十一章 操作符 在Scala中, 操作符是用来执行特定操作的符号或符号组合 ; Scala允许开发人员自定义操作符, 这些操作符可以是字母、数字…

高效数据架构:分表流程实践

前言 ​ 随着业务的不断扩展&#xff0c;数据量激增成为不可避免的现象。当数据量达到某一临界点时&#xff0c;单一的数据表可能无法承载如此庞大的数据量&#xff0c;此时就需要考虑进行分库分表的策略。尽管业界普遍认为数据量达到1000万时就应考虑分表&#xff0c;但实际上…

JS:异步输出顺序问题

闲着没事儿出一道异步的题给大伙儿打发时间 先看题目&#xff1a; <script> 2 console.log("1"); // 同步任务4 setTimeout(() > { 5 console.log("2"); 6 }, 0); 7 8 Promise.resolve().then(() > { 9 console.log("3")…

Windows搭建nacos集群

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 下载地址&#xff1a;Tags alibaba/nacos GitHub 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;8888 解压文件夹 目录说明&am…

力扣-1984. 学生分数的最小差值

文章目录 力扣题目工程代码C实现python实现 力扣题目 给你一个 下标从 0 开始 的整数数组 nums &#xff0c;其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。 从数组中选出任意 k 名学生的分数&#xff0c;使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。…

学习PLC+LabVIEW

学习PLC的前途 前景广阔 PLC&#xff08;Programmable Logic Controller&#xff09;是工业自动化和控制系统的核心组件&#xff0c;广泛应用于制造业、能源、交通、建筑等领域。随着工业4.0和智能制造的发展&#xff0c;对PLC技术的需求将持续增长。学习PLC有以下前景&#…

leetcode hot100 之 最长公共子序列

题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;…

python学习 -You-Get视频下载使用案例

You-Get 是一个命令行程序&#xff0c;提供便利的方式来下载网络上的媒体信息。 You-Get 是一个用于从网页下载媒体内容&#xff08;如视频、音频、图片&#xff09;的Python库。它支持多种网站&#xff0c;能够捕获并下载这些网站中直接或间接提供的媒体资源。You-Get 的设计…

网络限速导致的服务器访问https异常得处理过程

某日&#xff0c;测试人员反馈测试服务器无法获取到从公网下载的订单消息&#xff0c;首先我们的平台逻辑很简单&#xff0c;订单信息是从公网地址直接获取的。所以很明显我们需要排查一下网络通信是否正常&#xff0c;经过ping过后发现域名正常ping通。但是我们使用curl或者wg…

如何从零训练多模态大模型(预训练方向)

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

JVM (四)GC过程

一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭&#xff0c;栈帧随着方法的进入和退出做入栈和出栈操作&#xff0c;实现了自动的内存清理&#xff0c;因此&#xff0c;内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图&#xff1a; ① 年轻代对象的移动…

HALCON-从入门到入门-阈值分割定位算子综合运用

1.废话 之前我的一个师兄告诉我&#xff0c;针对图像上想要定位的内容&#xff0c;机器视觉中定位的方式有很多种&#xff0c;但是如果用阈值分割定位可以做的&#xff0c;就不要用模板匹配了。因为基于形状的模板匹配始终会存在匹配不到的风险&#xff0c;那如果打光效果可以…

记录清除挖矿病毒 solrd 过程

1、发现solrd病毒 端午节期间&#xff0c;kafka 服务器被黑客攻击了&#xff0c;植入了挖矿病毒 solrd&#xff0c;这个病毒很聪明&#xff0c;内存&#xff0c;CPU并没有异常升高&#xff0c;以致于上班第一天完全没有察觉。 上班第一天 正常登录服务器查看 flink ,消费kafka…

【qt】视口和窗口坐标

视口和窗口坐标 一.视口和窗口坐标的原理二.视口和窗口坐标的好处三.演示好处四.总结 一.视口和窗口坐标的原理 在绘图事件中进行绘图 void Widget::paintEvent(QPaintEvent *event) {QPainter painter(this);QRect rect(200,0,200,200);painter.drawRect(rect);//设置视口的…

HCIA12 NAT网络地址转换实验

NAT&#xff08;Network Address Translation&#xff09;是将 IP 报头中的 IP 地址转换为另一个 IP 地址的过程。主要俩好处&#xff1a; • 有效避免来自外网的攻击&#xff0c;可以很大程度上提高网络安全性。 • 控制内网主机访问外网&#xff0c;同时也可以控制外网…

SwanLab系列教程:用swanlab.Text记录文本

SwanLab是一个由国内团队开源的机器学习实验跟踪工具&#xff0c;相比于Tensorboard有更丰富的功能、更友好的UI界面&#xff0c;以及更重要的云端同步、多人协作功能。 安装&#xff1a;pip install swanlab 本教程主要介绍如何用swanlab.Text记录文本&#xff0c;这在做NLP…

描述常见的Java安全漏洞和防范措施

常见的Java安全漏洞及其防范措施可以归纳如下&#xff1a; 一、常见的Java安全漏洞 跨站脚本攻击&#xff08;XSS&#xff09; 漏洞描述&#xff1a;攻击者通过在网页中插入恶意脚本来获取用户的敏感信息或执行恶意操作。防范措施&#xff1a; 输入验证和过滤&#xff1a;对用…