MogDBopenGauss查询重写规则uniquecheck

在MogDB&openGauss中,参数rewrite_rule用于控制查询重写,本文介绍查询重写规则uniquecheck
uniquecheck表示提升无agg的where子查询

现在有如下例子

orcl=> explain analyze select count(*)from test01 t1where t1.data_object_id =(select data_object_idfrom test02 t2where t1.object_id = t2.object_id);QUERY PLAN                                                                             
-------------------------------------------------------------------------------------------------------------------------------------------------------------------Aggregate  (cost=369500968.48..369500968.49 rows=1 width=20) (actual time=122494.785..122494.785 rows=1 loops=1)->  Seq Scan on test01 t1  (cost=0.00..369500411.84 rows=222656 width=12) (actual time=0.912..121981.180 rows=4696064 loops=1)Filter: (data_object_id = (SubPlan 1))Rows Removed by Filter: 39841280SubPlan 1->  Index Scan using idx_test02_objectid on test02 t2  (cost=0.00..8.27 rows=1 width=6) (actual time=94019.753..99841.735 rows=44537344 loops=44537344)Index Cond: (t1.object_id = object_id)Total runtime: 122494.942 ms
(8 rows)

从执行计划上可以看到test01 t1是大表,有4000多万行数据
子查询test02 t2没有被提升(Oracle的说法是没有被展开),走了filter,被扫描了4000多万次
整个SQL查询耗时122秒,性能较差
现在设置rewrite_rule=uniquecheck,我们再来看一下执行计划

orcl=> explain analyze select /*+ set(rewrite_rule uniquecheck) */  count(*)from test01 t1where t1.data_object_id =(select data_object_idfrom test02 t2where t1.object_id = t2.object_id);QUERY PLAN                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------Aggregate  (cost=1467229.99..1467230.00 rows=1 width=8) (actual time=10758.577..10758.577 rows=1 loops=1)->  Hash Join  (cost=5660.88..1467225.97 rows=1608 width=0) (actual time=66.574..10424.858 rows=4696064 loops=1)Hash Cond: ((t1.object_id = subquery."?column?") AND (t1.data_object_id = subquery.data_object_id))->  Seq Scan on test01 t1  (cost=0.00..1227776.53 rows=44531153 width=12) (actual time=0.003..3561.282 rows=44537344 loops=1)->  Hash  (cost=4356.08..4356.08 rows=86987 width=12) (actual time=65.462..65.462 rows=9172 loops=1)Buckets: 131072  Batches: 1  Memory Usage: 1427kB->  Subquery Scan on subquery  (cost=2616.34..4356.08 rows=86987 width=12) (actual time=33.027..54.531 rows=86987 loops=1)->  HashAggregate  (cost=2616.34..3486.21 rows=86987 width=12) (actual time=33.025..47.518 rows=86987 loops=1)Group By Key: t2.object_idUnique Check Required->  Seq Scan on test02 t2  (cost=0.00..2398.87 rows=86987 width=12) (actual time=0.005..9.467 rows=86987 loops=1)Total runtime: 10758.989 ms
(12 rows)

设置rewrite_rule=uniquecheck之后,子查询被提升了,t1和t2走了hash join
整个SQL耗时10秒,性能较好
执行计划中Unique Check Required表示检查子查询JOIN列(t2.object_id)是否唯一
如果子查询JOIN列(t2.object_id)不唯一,SQL会报错

orcl=> insert into test02 select * from test02;
INSERT 0 86987
orcl=> explain analyze select /*+ set(rewrite_rule uniquecheck) */  count(*)from test01 t1where t1.data_object_id =(select data_object_idfrom test02 t2where t1.object_id = t2.object_id);
ERROR:  more than one row returned by a subquery used as an expression

如果子查询有agg函数,无需设置查询重写参数,可以自动提升

orcl=> explain analyze select count(*)from test01 t1where t1.data_object_id =(select max(data_object_id)from test02 t2where t1.object_id = t2.object_id); QUERY PLAN                                                                   
------------------------------------------------------------------------------------------------------------------------------------------------Aggregate  (cost=1470319.09..1470319.10 rows=1 width=8) (actual time=10345.027..10345.027 rows=1 loops=1)->  Hash Join  (cost=8749.93..1470315.02 rows=1628 width=0) (actual time=122.192..10044.758 rows=4696064 loops=1)Hash Cond: ((t1.object_id = subquery."?column?") AND (t1.data_object_id = subquery.max))->  Seq Scan on test01 t1  (cost=0.00..1227776.53 rows=44531153 width=12) (actual time=0.007..3708.561 rows=44537344 loops=1)->  Hash  (cost=7428.51..7428.51 rows=88095 width=38) (actual time=120.853..120.853 rows=9172 loops=1)Buckets: 131072  Batches: 1  Memory Usage: 1427kB->  Subquery Scan on subquery  (cost=5666.61..7428.51 rows=88095 width=38) (actual time=79.485..110.452 rows=86987 loops=1)->  HashAggregate  (cost=5666.61..6547.56 rows=88095 width=44) (actual time=79.483..103.440 rows=86987 loops=1)Group By Key: t2.object_id->  Seq Scan on test02 t2  (cost=0.00..4796.74 rows=173974 width=12) (actual time=0.007..20.196 rows=173974 loops=1)Total runtime: 10345.491 ms
(11 rows)

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

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

相关文章

文件系统和日志分析

文件系统 概述 文件是存储在硬盘上的。硬盘上的最小存储单位是扇区,每个扇区的大小是512字节。 inode号:又叫索引号,保存的是元信息(主要有文件的属性 :包括权限,创建者,创建日期等&#xff…

Nodejs 调用langchain的实验

langchain 支持js/ts 语言,可以在nodeJs 中调用langchain 。这有利于在网站后台软件中使用,本博文记录做的小实验。 安装与升级 升级node 直接在官网下载,重新安装就可以了。 安装大模型模块 npm install openai 安装langchain npm insta…

Renesas MCU之使用e² studio搭建开发环境

目录 概述 1 e studio介绍 2 搭建Renesas MUC开发环境 2.1 软件版本信息 2.2 安装软件 3 创建工程 3.1 板卡硬件接口 3.2 FSP配置IO 4 Generate Project 4.1 项目目录介绍 4.2 LED接口相关驱动 5 调试 5.1 测试代码 5.2 J-Link调试代码 5.3 硬件结构 概述 本文主…

ES6-01-简介

一、什么是ES6? 每年一个版本o(╥﹏╥)o。 二、javaScript新特性的特点 1、语法简洁,功能丰富; 2、框架开发应用。 3、岗位需求! 三、let关键字 3-1、声明变量 let a;let a,b;let e100;let f521, gmilk-love, h[]; 3-2、声明的…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

Linux C/C++目录操作

获取当前目录 #include <unistd.h>char *getcwd(char *buf,size_t size); char *get_current_dir_name(void);//注意释放内存 malloc() free()切换工作目录 #include <unistd.h>int chdir(const char *path);//0成功&#xff0c;其他失败&#xff08;目录不存在…

fbd编程语言:深度解析与未来展望

fbd编程语言&#xff1a;深度解析与未来展望 在编程语言的浩瀚海洋中&#xff0c;fbd编程语言以其独特的魅力和潜力&#xff0c;逐渐引起了开发者的关注。那么&#xff0c;fbd编程语言究竟有何特别之处&#xff1f;它的发展前景又如何呢&#xff1f;本文将从四个方面、五个方面…

PostgreSQL的视图pg_class

PostgreSQL的视图pg_class 在 PostgreSQL 中&#xff0c;pg_class 是一个系统目录表&#xff0c;用于存储所有关系&#xff08;如表、索引、视图、序列等&#xff09;的元数据。pg_class 是数据库系统的重要组成部分&#xff0c;包含了关于每个关系的具体信息。 pg_class 视图…

数据结构基础篇(7)

二十三.串、数组和广义表 -串的定义 零个或多个任意字符组成的有限序列串的术语 - 子串&#xff1a;一个串中任意连续字符组成的子序列&#xff08;含空串&#xff09;叫该串的子串- 主串&#xff1a;包含子串的串对应叫主串- 字符位置&#xff1a;字符在序列中序号是该字符串…

react-intl国际化在项目中的使用

前言 使用成熟的第三方库的国际化&#xff0c;可以直接使用封装好的方法&#xff0c;这个国际化的原理其实是使用了react 的第三方库react-intl &#xff0c;感觉主要比较好的就是使用其中的模版&#xff0c;它的本质还是通过了Provider的形式 第一步新建文件夹&#xff0c;计…

Python 限制输入数的范围

Python 限制输入数的范围 在 Python 编程中&#xff0c;我们经常需要限制用户输入的数据范围&#xff0c;以避免一些可能出现的问题。例如&#xff0c;在一个游戏程序中&#xff0c;我们可能想要确保玩家的分数在某个范围内&#xff0c;而不是太高或太低。在这个博文中&#x…

minos 2.4 中断虚拟化——中断子系统

首发公号&#xff1a;Rand_cs 该项目来自乐敏大佬&#xff1a;https://github.com/minosproject/minos 前面讲述了 minos 对 GICv2 的一些配置和管理&#xff0c;这一节再往上走一走&#xff0c;看看 minos 的中断子系统 中断 中断描述符 /** if a irq is handled by minos…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重要的环节。npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的包管理器&#xff0c;它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展&#xff0c;依赖库的版本更新和升级成…

字符串-459重复字符串

459. 重复的子字符串 - 力扣&#xff08;LeetCode&#xff09; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "ab…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

【明道云】如何在发送邮件模块给出多条记录形成的列表

【背景】 在完成批量分别发送邮件给不同部门担当的任务后,作为主管部门的用户希望能够获得成功得到处理的所有记录信息。这些信息需要在提醒邮件中以表格形式呈现。 【分析】 获得多条记录的方法能够拿到数据,问题在于如何合适地以表格形式呈现在邮件中。 只有富文本支持表…

c++文件流

1.流的概念 在 C 中&#xff0c;流&#xff08;stream&#xff09;是一种用来处理输入输出数据的概念。 可以把流看作从源头&#xff08;如文件、键盘、网络连接等&#xff09;到终端的数据传输管道。 这些管道在程序运行时动态创建&#xff0c;并可以连接到多种不同的源头和…

目标检测算法综述

1 研究背景 1.1 概述 目标检测是计算机视觉的重要分支&#xff0c;主要任务是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别&#xff0c;即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标…

Java线程几种常用方法详细说明

在Java编程中&#xff0c;多线程编程是一个非常重要的主题。它允许我们同时运行多个任务&#xff0c;提高程序的性能和响应速度。在这篇博客中&#xff0c;我们将介绍一些常用的Java线程方法和构造器&#xff0c;并通过示例代码展示如何使用它们。 Thread提供的常用方法 publi…