PostgreSQL和openGauss优化器对一个关联查询的SQL优化改写

PostgreSQL和openGauss数据库优化器在merge join关联查询的SQL优化改写

    • PostgreSQL 查询计划
    • openGauss 查询计划
    • 拓展对比

看腻了文章就来听听视频讲解吧:https://www.bilibili.com/video/BV1oH4y137P7/

数据库类型数据库版本
PostgreSQL16.2
openGauss6.0

创建测试表和数据

drop table IF EXISTS t_test_1;
drop table IF EXISTS t_test_2;
create table t_test_1 (id int, info text);
insert into t_test_1 select generate_series(1,10000000),'testdb';
create table t_test_2 as select * from t_test_1;
create index idx_t_test_1_id on t_test_1(id);
create index idx_t_test_2_id on t_test_2(id);
vacuum analyze t_test_1;
vacuum analyze t_test_2;

查询SQL

-- Merge Join
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5700000;
-- 等价写法
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5700000 and t2.id between 5000000 and 5700000;

PostgreSQL 查询计划

测试 PostgreSQL 数据库版本为:16.2

-- 关闭并行,方便查看执行计划
set max_parallel_workers = 0;
set max_parallel_workers_per_gather = 0;

image.png

从执行计划实际扫描的行数「 rows 」,可以看到 MergeJoin 会从索引开头全部扫描,直到超过匹配范围,即 t1 表根据where条件的between过滤走的索引扫描获取数据,t2 表从索引开头全部扫描到匹配范围。

openGauss 查询计划

测试 openGauss 数据库版本为:6.0

image.png
相比 PostgreSQL 的优化器,openGauss在这种场景的处理上相对智能点

拓展对比

PostgreSQL数据库调整where过滤条件行数后的执行计划:

-- Hash Join
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5500000;
-- 等价改写
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5500000 and t2.id between 5000000 and 5500000;

image.png

-- Nested Loop
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5200000;
-- 等价改写
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5200000 and t2.id between 5000000 and 5200000;

image.png

openGauss数据库调整where过滤条件行数后的执行计划:

-- PG Hash Join
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5500000;
-- PG Nested Loop
explain (analyze,buffers) select count(*) from t_test_1 t1 join t_test_2 t2 on (t1.id=t2.id) where t1.id between 5000000 and 5200000;

image.png

随着where条件过滤数量的变化,PostgreSQL执行计划选择的方式会跟着有所变化,openGauss都是选择merge join的执行计划,按照merge join针对数据有序的场景到也算是正常

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

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

相关文章

Python语言基础与由来介绍【自我维护版】

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 本篇博客是在已有的博客的基础上进行的维护。 主要…

MySQL中所有数据类型

MySQL支持多种数据类型,以下是MySQL中所有的数据类型及其简要解释: 数值型数据类型: INT:整数类型,用于存储整数值。TINYINT:小整数类型,用于存储小范围整数值。SMALLINT:小整数类型…

Delphi 解决字符串型的枚举值设置和读取的方法

需求: 对于枚举类型字段,一般数据库中存储的是整型值,但在业务处理中使用整型值可读性不强,且显示对应中文描述不方便。 例如订单状态的枚举值为:0:未支付 1:支付中 2:已支付 3:已退款,现在有一个…

知识付费系统怎么搭建_轻松拥有知识付费平台

在信息爆炸的时代,知识的获取已不再局限于传统的课堂和书籍。随着科技的进步和互联网的普及,我们迎来了一个全新的知识获取方式——知识付费。今天,就让我们一起探讨如何搭建一个专属于您的知识付费系统,开启智慧的大门&#xff0…

常见C语言基础说明二:位运算问题

一. 简介 前面一篇文章学习了 常见的 C语言基础题,文章如下: 常见C语言基础题说明一-CSDN博客 本文继续上一篇C语言基础题的学习。 二. C语言中 -> 位运算问题 1. 数据在计算机中的存储方式 当前的计算机系统使用的基本上是二进制系统&#…

C++中Using关键词的三种应用

引入单个名称 将某个单独名字引入到当前域中。不再需要使用作用域限定符:: 例如: using std::string; string s “hello,world”; using声明可以改变派生类对父类成员的访问控制。 例如: class Base{ protected: int n1;…

楼宇自控远程I/O革新BACnet/IP模块在暖通空调系统

在现代智能建筑的浪潮中,BACnet/IP分布式远程I/O控制器正逐步成为暖通空调(HAVC)系统升级转型的得力助手。本文将以某大型商业综合体为例,揭示BACnet/IP I/O模块如何在复杂多变的环境中发挥其独特优势,实现HVAC系统的智…

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss

互联网洗鞋工厂实现新时代下的家庭洗护服务;

互联网洗鞋工厂实现新时代下的家庭洗护服务; 拽牛科技洗护系统以智慧城市系统为依托,洗鞋工厂为中心,利用互联网+社区服务商模式,实现了新时代下的家庭洗护服务, 将客户﹣﹣社区服务商&#xfe63…

ansible内置主机变量及魔法变量

目录 概述实践代码执行效果 概述 简单实用版本 实践 代码 --- - name: Get IP Addresshosts: allgather_facts: notasks:- name: Get IP Addressansible.builtin.setup:register: host_ip- name: Print IP Addressansible.builtin.debug:msg: "The IP Address of {{ a…

基于Spring Boot框架实现大学生选课管理系统

文章目录 源代码下载地址项目介绍项目功能界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 教务处管理 开课、开班审批,排课处理,班级操作,选课时间段管理** 使用了sql解决了开课开班的时间段的冲突…

水电抄表方案是什么?

1.概述:水电抄表方案的重要性 水电抄表方案是现代城市管理中不可或缺的一部分,它涉及到了能源管理、费用结算和公共服务等多个领域。传统的抄表方式需要工作人员上门服务,费时费力且效率低下。随着科技的发展,智能化的水电抄表方…

【高阶数据结构】图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime

图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime 一、图的概述1、概述(纯理论部分)2、邻接矩阵(实现一个添加边的图)(1)思路介绍(2)代码部分(3)测试部分 3、…

类和对象test

一、初始化列表 引言: 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始 化一次&#x…

【华为】AC直连二层组网隧道转发实验配置

【华为】AC直连二层组网隧道转发实验配置 实验需求拓扑配置AC数据规划表 AC的配置顺序AC1基本配置(二层通信)AP上线VAP组关联--WLAN业务流量 LSW1AR1STA获取AP的业务流量 配置文档 实验需求 AC组网方式:直连二层组网。 业务数据转发方式:隧道转发。 DHC…

SpringCloudAlibaba:3.2dubbo的高级特性

启动时检查 简介 Dubbo在启动时检查依赖得服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题 建议 如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭ch…

SpringBoot 使用 @RequiredArgsConstructor(onConstructor_ = @Autowired) 报错解决

若使用 RequiredArgsConstructor(onConstructor_ Autowired) 启动报错,或者爆红可以使用以下方法解决 1. 安装或启用 Lombok插件 2. 检查 Lombok 版本 3. 若 onConstructor_ 爆红, 可能是IDEA中文软件包冲突 4. 若以上还是不行,可以添加…

Django和Python版本兼容表

记录一下Python和Django版本的兼容性对照表,如果还在维护老的项目可以作参考: Django 版本Python 版本备注5.1 3.10, 3.11, 3.125.0 3.10, 3.11, 3.12最低要求Python3.104.23.8, 3.9, 3.10, 3.11, 3.12 (从4.2.8开始)4.1 3.8, 3.9, 3.10, 3.11 (…

模方已经安装了3dmax,也装了插件,为什么一直显示没有插件?

答:主要是联动2018版本,然后插件在模方安装时候,会有选项自动安装联动插件,SketchUp(建议版本为2019),3dsMax(建议版本为2018) 模方是一款针对实景三维模型的冗余碎片、…

SpringBoot框架如何接入RocketMQ?

目录 一、SpringBoot框架介绍 二、RocketMQ介绍 三、RocketMQ的应用场景 四、SpringBoot框架如何接入RocketMQ 一、SpringBoot框架介绍 Spring Boot是一个开源的Java框架,它基于Spring框架,旨在简化Java应用程序的开发。Spring Boot通过自动化配置和约定优于配置的原则,大…