优化器核心技术—Join Reorder

news2025/1/18 7:39:04

Join Reorder 的简介

Join Reorder 是开务数据库 SQL 优化器中的核心优化算法,开务数据库优化器包括 RBO 和 CBO 两部分,负责计划优化,提升 SQL 执行性能。Join Reorder 能够保证在复杂查询执行的场景下,枚举合法的执行路径,保证 SQL 执行性能的稳定性。

开务数据库中的 Join Reorder 主要采用了基于规则变换的 Top-down 枚举算法,通过各种 Join 之间满足的 Reorder 规则,构建出完备的搜索空间,枚举所有能够正确执行的 Join 顺序,利用 Dpsube、CD-C 冲突检测、代价计算选出最优的执行顺序。

Join Reorder 的规则

1、Commutativity:example:R1⋈R2=R2⋈R1

首先是 Join 中的交换律,Table 1 展示了 7 种 Join 满足的情况,其中 + 号表示对于的 Join 类型满足交换律,- 号表示不满足。

2、Associativity:example:(R1⋈R2)⋈R3=R1⋈(R2⋈R3)

其次是 Join 中的结合律,Table 2 中展示了任意两种 Join 的满足情况,上标 1 和上标 2 表示当 Join 满足对 R2 的 null rejecting 时可应用该规则。

3、l-assocom: example:(R1⋈R2)⋈R3=(R1⋈R3)⋈R2

4、R-assocom: example:R1⋈(R2⋈R3)=R2⋈(R1⋈R3)

上述第 3 和第 4 条,是左(右)交换结合律,也是结合律和交换律的一种综合应用。Table 3 展示了任意两种 Join 满足该规律的情况,上标 1、2、3、4 表示对应的 Join 条件满足对 R1 或 R3 的 null rejecting 时可应用该规则。

Dpsube 算法

递归地从关系集合 R 中选出子集对 {S1,S2},求解 BestPlan{R} = BestPlan(S1) join BestPlan(S2) 。其中 Dpsube 算法中核心的问题在于 applicable 的实现。

CD-C 冲突检测算法

递归遍历 Join graph 中当前 Edge 的左右边集,根据规则变换表 Comm、Assoc、l-assocom、R-assocom 记录下当前 Edge 的冲突规则(算法流程中的 CR),在 Dpsube 流程中根据是否满足 CR 枚举 Valid Join,对应 Dpsube 的 applicable 判断。

Join Reorder 的实现

1、populateGraph

该流程中会递归遍历初始生成的 left-deep-tree,构建用于 Join order 枚举的 Join hyper-graph,区别于普通的 graph 结构,Join hyper-graph 中的边表示谓词条件,该条边可以连接多个顶点(一个顶点看作一个关系)。

在该流程中,会有一个 Join-order-limit 限制,默认为 4,超过 4 个 Table 部分的 Join 关系不会进行 Join order 的调整,被当作一个整体的关系表达式参与 Join Reorder。

2、ensureClosure

该步骤确定谓词的传递性闭包,可以推出隐藏的谓词条件,以便于发掘更多的 Join ordering。例如:R1.i= R2.i AND R2.i=R3.i => R1.i=R3.i

3、DpSube

采用文中的 Dpsube 算法,如果存在子集对 {S1,S2} 对于某个 Join Edge,能够满足该 Edge 下的冲突规则,生成的 Join 为合法 Join,Dpsube 按照这种方式枚举所有的 Join 顺序,在后续的 CBO 流程中,选出 cost 最低的一个。

4、makeInnerEdge

采用 CD-C 冲突检测算法,记录每个 Join Edge 的冲突规则集,用于之后 Dpsube 枚举 Join 流程的合法性判断,在开务数据库中,增加了一个特殊处理:如果 STO(left(edge)) ⊂ TES(edge),则不进行该边的冲突规则添加。

END

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

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

相关文章

分布式系统稳定性建设指南

来源: 中国信息通信研究院 系统稳定性能建设是一个系统化工程,需要硬件软件,需要从企业工程建设的全环节进行设计和实施,充分利用以混沌工程、全链路压测为代表的分布式稳定性保障技术,建设保障能力,改造运…

域名系统 DNS(计算机网络-应用层)

目录 互联网的域名结构 顶级域名 TLD(Top Level Domain) 域名服务器 域名系统 DNS 域名解析的过程 域名服务器的四种类型 本地域名服务器 DNS 协议 DNS缓存 DNS提供的其它服务 互联网的域名结构 域名系统 DNS (Domain Name System),实现主机名(域…

(三)HTTPTomcatServlet

一、HTTP HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 HTTP协议特点: (1)基于TCP协议:面向连接,安全 (2)基于请求-响应模型的…

漫画 | JavaScript杀死了编程......

上班路上,张大胖突然想到一个点子。晚上,张大胖开工,决定把好点子给实现了。JavaScript开发效率贼高,项目迅速完成。项目开源发布,获得了不少用户,收获了不少star,张大胖非常满意。转眼间&#…

【GlobalMapper精品教程】039:GM面状数据符号化设置案例教程

GM面状数据符号化设置案例教程。 文章目录 一、使用基于分类或自定义样式的默认样式二、对所有要素使用相同样式三、基于属性/名称值应用样式四、随机指定颜色给要素一、使用基于分类或自定义样式的默认样式 该样式类似于其他GIS软件的单一样式,即为数据加载的默认样式。加载…

Stable Diffusion攻略集(Stable Diffusion官方文档、kaggle notebook、webui资源帖)

文章目录第一部分一、 Features:Textual Inversion(文本反转)1.1 Textual Inversion 简介1.1.1 摘要1.1.2 算法1.1.3 模型效果1.2 Textual Inversion of webai1.2.1 预训练embedding用于图片生成1.2.2 训练embedding1.2.3 Finding embeddings…

【Redis】知识体系结构构建以及常见考题汇总

【Redis】知识体系结构构建以及常见考题汇总1、思维导图2、Redis体系结构:原理、部署2.1、Redis实现原理2.1.1、Redis中数据结构2.1.2、不同对象的数据类型(基本类型、特殊类型)2.2、Redis部署2.2.1、基本配置(缓存的更新、删除和…

【Linux】基础命令

目录 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.less指令 12. head和tail 13.date指令 14.grep指令 15.bc指令 16.重要的几个热键 1.ls指令 语法:ls 选项 …

Taro React组件开发(2) —— RuiEditor 富文本编辑器【兼容H5和微信小程序】

1. 富文本编辑器需求分析 需要实现图片上传显示,上传使用Taro的 chooseImage 和 uploadFile,完成图片的上传!!!文字的居左、居中、居右展示,使用格式化方法 format!!!文字的加粗、倾斜、下划线,使用格式化方法 format!!!2. 富文本编辑 获取提示文本 placeholder;…

【C++】string类常用函数接口

在使用库函数中的string类时,需要包含头文件#include 。 1.构造函数和拷贝构造 string s1;string s2("hello world");string s3(s2);下面通过VS调试的监视窗口看一下初始化之后的内容: 还有一种构造函数,是拷贝一个字符串的一部分…

Kubernetes 1.26 新功能 Pod 调度就绪特性解析

Kubernetes 1.26 新功能 Pod 调度就绪特性解析 Kubernetes 1.26 引入了 Pod 的一个新特性:scheduling gates。在 Kubernetes 中,调度门是告诉调度程序何时准备好考虑调度 Pod 的 keys。 它解决了什么问题? 当一个 Pod 创建时,调…

从发现SQL注入到ssh连接

前言: 某天,同事扔了一个教育站点过来,里面的url看起来像有sql注入。正好最近手痒痒,就直接开始。 一、发现时间盲注和源码 后面发现他发的url是不存在SQL注入的,但是我在其他地方发现了SQL盲注。然后改站点本身也可…

C++/Java调用C++动态链接库————附带示例和详细讲解

文章目录0 准备1 C调用动态链接库2 Java调用C动态链接库3 运行0 准备 在CMake中,使用如下的方法把代码编译成动态/静态链接库: # 设置项目名 project(getMatInfo)# 设置c版本 set(CMAKE_CXX_STANDARD 11)# 如果不填写SHARE,默认为静态链接…

Spring Security开发实践

Spring Security 是 Spring 家族中用于提供认证、授权和攻击防护功能的一套安全框架。它也是 Spring 应用在安全框架方面的公认标准。 Spring Security 安全框架适合为 Spring Boot 项目提供安全保护,所以如果您是个 Spring Boot 项目的开发人员,且正在寻…

Python 将视频按照时间维度剪切 | Python工具

目录 前言 环境依赖 代码 总结 前言 本文提供将视频按照时间维度进行剪切的工具方法,一如既往的实用主义。 环境依赖 ffmpeg环境安装,可以参考我的另一篇文章:windows ffmpeg安装部署_阿良的博客-CSDN博客 本文主要使用到的不是ffmpeg&a…

基于Vue.js+Node问卷调查系统的设计与实现

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

ORM框架

ORM框架可以做的两件事: 创建、修改、删除数据库中的表(不用写SQL语句)。【无法创建数据库】操作表中的数据(不用写SQL语句) 1.安装第三方模块: pip3.9 install mysqlclient 2.创建数据库: 启动Mysql服务…

20221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK预处理

20221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK预处理 2022/12/26 16:40 结论: 1、风火轮技术团队的技术支持力度欠佳! 淘宝客服只能处理发货问题,发发SDK还可以,技术问题只能找联系方式 联系手机:18926…

一起从零开始学VUE(16)生命周期与组合式API

文章目录生命周期自定义hook函数toRef其他组合APIshallowReactive与shallowRefreadonly与shallowReadonllytoRaw 与 markRawcustomRefprovide与inject响应式数据的判断生命周期 除了直接写对应的钩子函数外,Vue3.0也提供了composition API形式的钩子函数&#xff0c…

【再学Tensorflow2】TensorFlow2的建模流程:电影评论分析

TensorFlow2的建模流程:电影评论分析词嵌入技术数据准备定义模型训练模型评估模型使用模型保存模型参考资料情感分析无处不在,它是一种基于自然语言处理的分类技术。其主要解决的问题是给定一段话,判断这段话是正面的还是负面的。情感分析的本…