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

背景

在查询语句中,若涉及半连接(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 云数据库现已支持免费试用,现在申请,体验分布式数据库带来全新体验吧 ~

相关推荐
Mr_Xuhhh8 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
司沐_Simuoss13 小时前
Text to SQL系统的千层套路~
数据库·人工智能·sql·语言模型·系统架构
ActionTech16 小时前
MySQL 用好 Optimizer Trace,深刻理解 SQL 优化过程!
sql·mysql·oracle
Mr_Xuhhh17 小时前
MySQL索引深度解析:从原理到实践
数据库·sql·mysql
多多*17 小时前
Mysql数据库相关 事务 MVCC与锁的爱恨情仇 锁的层次架构 InnoDB锁分析
java·数据库·windows·sql·oracle·面试·哈希算法
何以不说话19 小时前
堡垒机jumpserver
运维·sql
远方160919 小时前
112-Oracle database 26ai下载和安装环境准备
大数据·数据库·sql·oracle·database
白帽子凯哥哥20 小时前
网络安全Web基础完全指南:从小白到入门安全测试
前端·sql·web安全·信息安全·渗透测试·漏洞
cheems952720 小时前
【MySQL】SQL调优:数据库性能优化(一)
数据库·sql·mysql
中二病码农不会遇见C++学姐20 小时前
文明6 Mod入门:三分钟学会用SQL制作第一个修改器
sql·游戏