半连接转内连接规则的原理与代码解析 |OceanBase查询优化

news/2024/12/22 15:01:54/

背景

在查询语句中,若涉及半连接(semi join)操作,由于半连接不满足交换律的规则,连接操作必须遵循语句中定义的顺序执行,从而限制了优化器根据参与连接的表的实际数据量来灵活选择优化策略的能力。为此,OceanBase中制定了半连接转内连接规则,该规则允许在满足特定条件的情况下,将半连接操作转换为内连接,为优化器进的一步优化提供了基础。

半连接转内连接规则的基本原理

考虑如下情况:

SELECT * FROM t1 SEMI JOIN t2 on t1.c1 = t2.c1

我们可以将上述查询直接转为内连接,如下所示:

SELECT t1.* FROM t1, t2 WHERE t1.c1 = t2.c1

这里可能存在一个问题,即当连接条件的右表部分(如t2.c1)不唯一时,在内连接执行时可能会造成左表记录被复制多份(即一条左表记录对应多条右表记录),从而违背原来的语义。因此仅当上述右表满足唯一条件时,才可以进行改写。

半连接转内连接规则代码解析

半连接转内连接规则的入口为ObTransformSemiToInner::transform_one_stmt,该函数最终调用transform_semi_to_inner函数执行改写。由于这项改写并不一定能够带来更好的执行开销,因此需要在改写完成后调用accept_transform函数判断是否接受改写结果。

transform_semi_to_inner函数首先会调用check_basic_validity函数判断查询语句是否满足改写条件,如果满足,则调用do_transform函数执行改写。

check_basic_validity函数负责判断指定的半连接是否可以被改写为内连接,能够被转换的半连接需要满足如下条件:

  1. 半连接的连接条件均为equal表达式。
  2. 满足以下两个条件中的一个:半连接条件的右表表达式对应唯一结果或可以通过视图查询转换为唯一结果;半连接位于某个exist/no_exist/any/all子查询中,此时由于转内连接造成的数据重复可以被忽略。

该函数首先调用check_semi_join_condition函数提取半连接条件的左右表达式集合,并判断是否所有条件都是equal条件,然后按照如下流程判断是否满足改写条件:

  1. 调用check_right_table_output_one_row函数判断右表是否为视图查询且添加了limit 1表达式,此时右表至多输出一行记录。
  2. 调用check_right_exprs_unique函数判断右表表达式是否对应唯一结果。
  3. 调用check_stmt_is_non_sens_dul_vals函数判断半连接语句是否位于某个exist/no_exist/any/all子查询中。
  4. 调用check_can_add_distinct函数判断是否可以通过将右表转化为视图表,然后在视图查询中添加distinct的方式保证结果唯一。如果可以,则调用check_join_condition_match_index函数进一步检查左表条件是否与某个索引匹配(这里应该是性能上的考量)。

do_transform函数负责执行实际的改写操作,该函数执行逻辑较为简单。如果右表满足上述1,2,3项中的任意一项,则将右表添加到查询语句中的from部分即可(相当于隐式的inner join);如果满足第4项,则将右表转换为视图查询,然后将查询语句设置为distinct。


OceanBase 云数据库现已支持免费试用,现在申请,体验分布式数据库带来全新体验吧 ~


http://www.ppmy.cn/news/1557217.html

相关文章

相机与NAS的奇妙组合,如何使用相机拍照自动上传或备份到NAS

相机与NAS的奇妙组合,如何使用相机拍照自动上传或备份到NAS 哈喽小伙伴们好,我是Stark-C~ 对于喜欢使用专业器材拍照摄影的小伙伴来说,想要将相机存储卡中的照片或视频导出到电脑上,要么是使用数据线直接和相机连接,…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…

如何更改 maven 指定的 java 版本 set JAVA_HOME=C:\Program Files\Java\jdk1.8

当我们用 mvn 在终端执行的时候 例如 mvn clean test执行结果如下: 此时我们想要修改 maven 指定的JAVA_HOME 找到maven的安装目录,打开 mvn.cmd 然后鼠标右键,点击编辑按钮 将 第一行 JAVA_HOME 设置为自己的本地java目录即可 然后再次…

Vue 环境变量配置、使用方法、注意事项

注意事项: 环境变量必须以 VUE_APP_ 开头,只有 VUE_APP_ 开头的变量才会被 webpack 处理NODE_ENV 是内置的环境变量,NODE_ENV 不需要 VUE_APP_ 前缀修改环境变量后需要重启开发服务器才能生效环境变量在构建时会被静态替换环境变量在客户端代…

踩准智能汽车+机器人两大风口,速腾聚创AI+机器人应用双线爆发

日前,RoboSense速腾聚创交出了一份亮眼的Q3财报。受到多重利好消息影响,其股价也应势连续大涨。截止12月9日发稿前,速腾聚创股价近一个月内累计涨幅已超88%。 财务数据方面,速腾聚创在今年前三季度实现总收入约11.3亿元&#xff0…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

图漾相机-ROS1_SDK_ubuntu版本编译(新版本)

文章目录 官网编译文档链接官网SDK下载链接1、下载 Camport ROS1 SDK1.下载git2、下载链接 2、准备编译工作1、安装 catkin2、配置环境变量3. 将Camport3中的linux库文件拷贝到 user/lib目录下4、修改lunch文件制定相机(可以放在最后可以参考在线文档)**…

数据结构(C语言版)-6.查找

1. 查找的基本概念 2. 静态查找 2.1 顺序查找 typedef int KeyType; typedef int InfoType; typedef struct {KeyType key;InfoType otherdata; }SeqList; // 顺序表类型 // 顺序查找int SeqSearch(SeqList R[], int n, int k) {int i n;R[0].key k; // R[0].key为查找不成…