当前位置: 首页 > news >正文

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列:外连接转内连接的常见场景与错误》一文中,我们了解到谓词条件可以过滤掉连接结果中的 null 情形的,将外连接转化为内连接的做法是可行的,正如图1中路径(a)所示。此时,敏锐的你或许会进一步思考:当谓词成功筛选出这些因连接补的NULL行后,是否还隐藏着其他的优化空间?

答案可以参考图1中路径(b)所示:对于左外连接(LeftJoin)或右外连接(RightJoin),OceanBase会把外连接转位AntiJoin。在LeftJoin和RIghtJoin场景,驱动表(在这个例子中是t1)需要扫描被驱动表(t2)的所有行,找出所有匹配的行。 但转换成AntiJoin之后,由于AntiJoin的目的是输出没有在被驱动表中找到匹配行的驱动表中的行,因此在AntiJoin场景,只要在被驱动表中找到一行满足连接条件的数据,我们就可以认为驱动表中的行不满足输出条件,就可以停止这轮扫描。综上,我们可以知道LeftJoin/RightJoin转换成AntiJoin之后可以减少扫描被驱动表的行数

更多内容可以查看【OceanBase 查询改写】系列


 

外连接转AntiJoin

对于左外连接和右外连接,当针对基表的过滤谓词可以筛选出因为连接而补null的行时,我们可以把外连接转化为AntiJoin。图2以最简单的过滤谓词 column is null为例描述了不同外连转AntiJoin的场景。

然而在实际查询中,谓词不会一直像 t2.c1 is null 这么简单。在一个 SQL 语句中,is null 谓词的左边可以是复杂表达式{如(t2.c1 + t2.c2) is null},于是,我们进一步推广支持外连接转AntiJoin的谓词形态,让这个改写在复杂谓词条件下也能发生,并且结合前文提到的谓词推导和谓词移动,使更多的查询能从外连接转AntiJoin中获益。在了解复杂条件的改写之前,我们需要先了解OceanBase中空值传递的概念。

对于复杂表达式 A = b+c+d,它是由表达式 b,c,d构成的。假设当b为null的时候,表达式A也会null,那我们则认为表达式A对于表达式b是空值传递的。 在这个例子中,表达式A对于b, c, d都是空值传递的。常见的空值传递判断条件有:

  1. 表达式对自身是空值传递的
  2. 基本的算数表达式对其子表达式都是空值传递的
  3. 一些系统函数(SQRT,LOG_TEN,LOG_TWO,FLOOR,CEIL,LEAST,GREATEST,LEAST_INNER,GREATEST_INNER,MIN,MAX,SUM等)
  4. 非AND/OR/IS/IS NOT的布尔表达式

在了解空值传递这个概念后,我们可以知道:只要is null谓词左边的表达式对于被驱动表中的列是空值传递的(如 (t2.c1+t2.c2) 对于t2.c1是空值传递的),那在t2.c1是null的时候is null谓词左边的表达式也是null,is null谓词结果为true,如此便可以把被驱动表补null的行筛选出来。

综上所述,我们知道即便是对于 (t2.c1+t2.c2) is null这样的复杂谓词,只要满足对被驱动表中的列空值传递的条件,在特定条件也可以做外连接转AntiJoin的改写。至于这个特定条件是什么,我们接着往下看。

改写限制条件

条件1:对于补null侧的基表,谓词中的列不能存在null值。

-- 影片表
MOVIE(movie_id, movie_name)
movie_id	movie_name
1					'Gone With Wind'
2					'Leon'
-- 排片表
PLAY(play_id, movie_id, time, price)
play_id	movie_id	time					price
1				1					'2022-10-01'	35
2				1					NULL					40Q1: 
SELECT 	MOVIE.movie_name,PLAY.time
FROM	 	MOVIELEFT JOIN PLAYON	MOVIE.movie_id = PLAY.movie_id;
WHERE		PLAY.time is null;-- 外连接结果
R1:
movie_name				price
'Gone With Wind'	40
'Leon'						NULL-- AntiJoin结果
R2:
movie_name				time
'Leon'						NULL

条件2:对于非补null侧的基表, 谓词中的列不应该对谓词是空值传递的。

-- 影片表
MOVIE(movie_id, movie_name)
movie_id	movie_name
1					'Gone With Wind'
2					NULL
-- 排片表
PLAY(play_id, movie_id, time, price)
play_id	movie_id	time					price
1				1					'2022-10-01'	35
2				2					'2022-10-02'	40Q2: 
SELECT 	MOVIE.movie_name,PLAY.time
FROM	 	MOVIELEFT JOIN PLAYON	MOVIE.movie_id = PLAY.movie_id;
WHERE		(PLAY.time AND MOVIE.movie_name) is null;-- 外连接结果
R3:
movie_name				price
NULL							40-- AntiJoin结果
R4:
movie_name				time	

总结

看到这里,相信你已经了解了LeftJoin和RightJoin改写为AntiJoin的优点及适用场景,相较于LeftJoin和RightJoin需要扫描被驱动表的所有行,AntiJoin在找到第一行匹配的数据后就会停止扫描被驱动表,可以减少实际扫描数据的数量,因而在执行的时候有更好的性能。我们认为,谓词能筛选出被驱动表补null的行时,就能进行半连接转Anti的改写,但是依旧需要注意数据原本就可能为null的情况。此外,借助空值传递的概念,我们把能做改写的场景从简单谓词场景推广到了复杂谓词场景。

相关文章:

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列:外连接转内连接的常见场景与错误》一文中,我们了解到谓词条件可以过滤掉连接结果中的 null 情形的,将外连接转化为内连接的做法是可行的,正如图1中路径(a)所示。此时,敏锐的你或许会进一步思考&#…...

华为实训课笔记 2024 1223-1224

华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…...

MySQL超详细安装配置教程(亲测有效)

目录 1.下载mysql 2.环境配置 3.安装mysql ​4.navicat工具下载与连接 ​5总结 1.下载mysql mysql下载--MySQL :: 下载 MySQL 社区服务器 下载的时候这里直接逃过就行 我这里的版本是最新的mysql8.0.37 下载完成之后,将压缩包进行解压 这里我建议大…...

MySQL 8.0:explain analyze 分析 SQL 执行过程

介绍 MySQL 8.0.16 引入一个实验特性:explain formattree ,树状的输出执行过程,以及预估成本和预估返 回行数。在 MySQL 8.0.18 又引入了 EXPLAIN ANALYZE,在 formattree 基础上,使用时,会执行 SQL &#…...

信管通低代码信息管理系统应用平台

目前,国家统一要求事业单位的电脑都要进行国产化替代,替代后使用的操作系统都是基于linux的,所有以前在WINDOWS下运行的系统都不能使用了,再者,各单位的软件都很零散,没有统一起来。需要把日常办公相关的软…...

git推送本地仓库到远程(Gitee)

目录 一、注册创建库 二、创建仓库 三、推送本地仓库到远程 1.修改本地仓库用户名和邮箱 2.本地库关联远程仓库 3.拉取远程仓库的文件 4.推送本地库的文件 5.查看远程仓库 四、远程分支查看 1.查看远程分支 2.修改test.txt文件 一、注册创建库 Gitee官网&#xff1…...

【C++语言】多态

一、多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某种行为,当不同的对象去完成时会产生出不同的状态。 我们可以举一个例子: 比如买票这种行为,当普通人买票时,是全价买票&am…...

ThinkPHP 吸收了Java Spring框架一些特性

ThinkPHP 吸收了Java Spring框架一些特性,下面介绍如下: 1、controller 控制器层 存放控制器层的文件,用于处理请求和响应 2、model 实体类 存放实体类的文件,用于定义数据模型 3、dao DAO层 存放DAO(数据访问…...

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能,确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW,可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法,并结合硬件选型提供实…...

记录一个SVR学习

1、为什么使用jupter来做数据预测?而不是传统pycharm编辑器 1、Jupyter Notebook 通过anaconda统一管理环境,可以运行python、R、Sql等数据分析常用语言。 2、做到交互式运行,可以逐步运行代码块,实时查看结果,便于调…...

Java内存区域进一步详解

方法区 方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,方法区到底要如何实现那就是虚拟机自己要考虑的事情了。也就是说,在不同的虚拟机实现上&am…...

SpiderFlow平台v0.5.0流程的执行过程

流程执行过程: 1. 流程启动 流程的执行通常从一个 开始节点 开始,该节点是整个爬虫任务的起点。开始节点没有实际的功能作用,主要作用是标记流程的起始。 执行顺序:在执行过程中,系统按照流程中的连接线顺序依次执行…...

利用.NET Upgrade Assitant对项目进行升级

本教程演示如何把WPF程序从 <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>升级到<TargetFramework>net8.0-windows</TargetFramework>. 下载并安装.NET Upgrade Assistant - Visual Studio Marketplace Supported .NET upgrades: .NET Frame…...

JAVA开发Erp时日志报错:SQL 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘***‘ 中的标识列插入显式值

错误提示 ### SQL: INSERT INTO sys_user ( user_id, username, password, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ? ) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时&…...

[计算机网络]ARP协议的故事:小明找小红的奇妙旅程

1.ARP小故事 在一个繁忙的网络世界中&#xff0c;每个设备都有自己的身份标识——MAC地址&#xff0c;就像每个人的身份证号码一样。在这个故事里&#xff0c;我们的主角小明&#xff08;主机&#xff09;需要找到小红&#xff08;目标主机&#xff09;的MAC地址&#xff0c;才…...

数学竞赛网站:构建互动学习的网络平台

2.1 MYSQL数据库 题目确定了是一个应用程序之后&#xff0c;就开始按部就班的进行设计与分析。本课题是需要数据库作为数据管理工具以及数据载体&#xff0c;从程序功能分析到数据分析&#xff0c;选择合适的关系型数据库是当下所选择的重要环节。关系型数据库可选择余地不多&a…...

IntelliJ IDEA 快捷键大全:提升开发效率的利器

目录 一、基础快捷键 1. 文件操作快捷键 2. 编辑&#xff08;Editing&#xff09; 2.1 代码补全与导航 2.2 代码编辑 2.3 代码折叠与展开 3. 查找与替换 4. 调试 5. 版本控制 高级快捷键 重构快捷键&#xff1a;让代码更加优雅 导航快捷键&#xff1a;快速定位代码 …...

机器人角度参考方式

机器人的角度可以根据需求和系统设计来决定。通常情况下&#xff0c;机器人角度&#xff08;如航向角或偏航角&#xff09;有两种常见的参考方式&#xff1a; 参考开机时的 0&#xff1a;这是最常见的方式&#xff0c;机器人在开机时会将当前的方向作为 0&#xff08;即参考方向…...

VSCode:IDE显示设置 --自定义字体及主题颜色

VSCode&#xff1a;IDE显示设置 1.设置字体大小2.设置主题背景 1.设置字体大小 &#xff08;1&#xff09;打开VSCode。 &#xff08;2&#xff09;打开设置&#xff1a;File – Preferences – Settings。 &#xff08;3&#xff09;设置字体大小&#xff1a;Text Editor –…...

docker run命令大全

docker run命令大全 基本语法常用选项基础选项资源限制网络配置存储卷和挂载环境变量重启策略其他高级选项示例总结docker run 命令是 Docker 中最常用和强大的命令之一,用于创建并启动一个新的容器。该命令支持多种选项和参数,可以满足各种使用场景的需求。以下是 docker ru…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...