优化器-RBO 的规则转化

news2024/11/18 4:43:55

一、RBO 背景介绍

RBO(Rule-Based Optimization,基于规则的优化器)有着一套严格的使用规则,按照 RBO 去写 SQL 语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”。

换言之 RBO 对数据不“敏感”,它根据指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中,索引的优先级大于全表扫描。RBO 是根据可用的访问路径以及访问路径等级来选择执行计划,在 RBO 中,SQL 的写法往往会影响执行计划。

二、Optgen 介绍

Optgen 是一种域细节语言 (DSL),它提供了一种直观的语法来定义、匹配、替换目标表达式树中的节点,优化器规则的编写便是基于这种语言。

代码中存在这样的模块:将 DSL 语言转化为真实的 go 语言(文件后缀 og.go),以便优化器调用。模块入口在 pkg/sql/opt/optgen/cmd/optgen/main.go 中的 func main(),这里暂不涉及,以下介绍中此模块简称“代码生成模块”。

三、RBO 规则介绍

RBO 涉及的规则定义在 kaiwu/pkg/sql/opt/norm/rules/*.opt 中。

1.关系代数的 9 种操作

关系代数中包括了:并、交、差、乘、选择、投影、联接、除、自然联接等操作。其中五个基本操作为并(∪)、差(-)、笛卡尔积(×)、投影(π)、选择(σ)。

2.关系代数表达式

由关系代数运算经有限次复合而成的式子称为关系代数表达式,这种表达式的运算结果仍然是一个关系,可以用关系代数表达式表示对数据库的查询和更新操作。

3.关系代数表达式的转换

若两个关系表达式在每一个有效数据实例中都会产生相同的结果集,则可以称他们是等价的(元组的顺利是无关紧要的,而且不能说明任何表达式更优于其他表达式)。

合取选择运算可以分解为单个选择运算,称为选择运算的级联:

选择运算具有交换律:

投影在合理的情况下,只有最后一个有效:

选择操作可与笛卡尔积以及连接相结合:

连接操作满足交换律:

自然连接满足结合律:

4.RBO 转化实例

语句如下:

  • select course_id, title from course;

  • select * from teaches join ① on teaches.course_id = ① .course_id;

  • select * from instructor join ② on Instructor.ID = ② .ID;

  • select name, title from ③ where dept_name = Music and year = 2009;

执行 ④ 语句,转换前的表达式树和转换后的表达式树如下:

在这次转换工程中,使用了谓词下推,结合律,转换后的表达式树一定优于前面的表达式树,这就称为 RBO,基于规则的转换。

5.RBO 基本规则

(1)列裁剪

Select a from t where b >5;

我们可以将 t 表中的所有数据读取上来,然后根据条件过滤,然后再投影,最后拿到列(a)的数据。也可以先进行列剪裁,先把 a,b 数据读取,然后根据过滤条件进行过滤,最后输出数据。

(2)最大最小消除

Select min(ID) from t;

这句话可以转换成 Select id from t order by id desc limit 1;

(3)投影消除

如果一个投影的输入和输出列是一样的,那么这个投影是无用的。

(4)谓词下推

尽量把选择的算子推到叶子节点,这样可以大大减少上面每个表达式节点的消耗。

考虑这样一个句子:Select * from t1,t2 where t1.a > 4 and t2.b >5;

如果先进行笛卡尔积在进行过滤条件时,则会产生很多不必要的元组,但是如果先过滤t1,t2 的关系,在进行笛卡尔积,那么表达式的消耗将大大减少。

在进行过滤时,尽可能精确到一个 select 算子,如若不能,则在具有过滤需要的列及时处理,比如 a.a > 5 and b.b > 10 and a.c > a.b 第一个和第二个条件都可以推到 select 算子中,在这个算子上面立即加一个 a.c > a.b 的过滤条件。

四、规则生成源代码介绍

1.生成代码模块定位,参数解释

入口函数 pkg/sql/opt/optgen/cmd/optgen/main.go 中的 func main(),如图所示:

Kaiwu/Makefile 中调用这个函数,需要输入 5 个参数 os.Args,这些参数依次如下(以探索阶段涉及的 factory.og.go 为例):

  • -out :输出文件标签

  • 输出文件名 :(pkg/sql/opt/xform/factory.og.go)

  • 命令标签 :(compile/explorer/exprs/factory/ops/ rulenames)

  • 结构定义文件 :(pkg/sql/opt/ops/*.opt)

  • 规则源文件 :(pkg/sql/opt/norm/rules/ opt/pkg/sql/opt/xform/rules/.opt)

Makefile 代码定位如下:

2.调试建议

调式某个 opt 文件生成 factory.og.go 文件,如 norm/rules/comp.opt,可以采用如下方式:

3.重要阶段介绍

(1)流程图中重要函数

a. 以 pkg/sql/opt/norm/rules/comp.opt 文件为例进行流程分析:

run(),Parse(),parseOne()函数

进入 Parse()函数——>parseOne():

① Parse()函数对parsed, args赋值;

② parseOne() 函数:裁剪 args a 和 b 参数,剩下 c、d、e;对 FlagSet 结构体中的 actual 赋值;

③ 将生成文件 b 参数赋值给 Flag 中的 Value。

b. g.globResolver(source)函数是将 pkg/sql/opt/ops/*.opt 中的文件 append 到 files 文件中,并将规则文件 pkg/sql/opt/norm/rules/comp.opt 文件加入到 file 中。

c. NewCompiler(files...)函数: 构建 Compiler 结构体,将 files 文件导入:

d. compiler.Compile()→ Parse()→ parseRoot()→ p.scan():

p.scan(): 根据返回值执行不同的操作

① WHITESPACE: 清除空白

② COMMENT: 向 Parser 中的 comment 中添加注释

③ LBRACKET:返回上层函数 parseRoot()

④ parseTags(): 解析出规则名和标准

⑤ parseRule():解析出具体规则

e. compiler.Compile()中的 compileDefines()函数:

将 defines 中的内容赋值给 Compiler→compiled→defineIndex中。

将 define 中的 Tags 赋值给 unique 中。

f. compiler.Compile()→compileRules()→ruleCompiler.compile():

将 pkg/sql/opt/ops/*.opt 文件中定义的元数据和 pkg/sql/opt/norm/rules/camp.opt 中所定义的规则相结合生成新规则,存于 ruleCompiler→compiled→Rules 中。

(2)代码流程图如下

五、总结

以上就是 RBO 的规则转化在数据库中的功能方式,通过规则查询优化器执行一个预设的计划,在此预设规则下,大幅提升执行效率。

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

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

相关文章

码元,码元速率,波特率,比特率(个人理解总结)

参考:https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E4%BC%A0%E8%BE%93%E9%80%9F%E7%8E%87/6305673 https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E9%80%9F%E7%8E%87/10945076 https://baike.baidu.com/item/%E6%9B%BC%E5%BD%BB%E6%96%AF%E7%89%B9%E7%BC%9…

低代码:如何成为企业业务价值提升的一大利器?

首先,来看低代码能为企业带来什么? 低代码开发能够增加软件所创造的价值,帮助企业机构衡量企业级低代码平台的价值并计算它将会产生的影响。 低代码在企业的现实运用中能为企业带来巨大的经济效益。众所周知,软件可以推动业务价值…

Cesium中的飞线效果-Shader

飞线的顶点着色器坐标系换算较为复杂。代码中的vertexShaderSource部分为cesium源码中附带的顶点着色器。后期增加了一些传参方法。 用到的GLSL的API: attribute vec2 st; 两个分量为 st.s: 飞线的长度(0-1) st.t: 飞线的宽度(0~1) czm_frameNumber 每帧都会自增,用…

metersphere将默认关闭加载的UI服务启动

目录 一、安装 二、配置 selenium-grid 三、下载驱动程序 三、运行驱动程序 四、将本地运行Selenium-server配置到MeterSphere平台 一、安装 /opt/metersphere/.env,有个 ui_enabled属性,改成true, 然后 msctl reload 二、配置 selenium-grid 这里…

pytest自动化测试执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…

硬盘已删除的数据怎么恢复?磁盘数据恢复,试试这3大方法!

电脑里面的硬盘起着存储安装程序或者保存着重要数据的功能,里面有我们很多数据,比如图片、文件、视频等。 有时遇到一些情况,我们把硬盘里面的重要数据删除了,或者是硬盘被损坏了,我们该怎么办?磁盘数据恢…

基于声学模型共享的零资源韩语识别系统

声学模型共享方法是极低资源小语种语音识别一种解决方案,能够实现不需要任何语音数据的语音识别。本文介绍清华大学语音与音频技术实验室的零资源韩语语音系统,其在不使用任何韩语语音数据的情况下,在Zeroth韩语数据集上的测试CER达到了27.33…

Redis主从架构 | 黑马Redis高级篇

目录 一、搭建主从架构 1、为什么要搭建 2、准备实例和配置 3、启动 4、开启主从关系 二、 数据同步原理 1、全量同步 2、命令传播 3、增量同步 三、常见面试题 一、搭建主从架构 1、为什么要搭建 如果服务器发生了宕机,由于数据恢复是需要点时间&#…

51.Isaac教程--使用强化学习的DollyDocking

使用强化学习的DollyDocking ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录使用强化学习的DollyDocking快速开始推理未来场景工厂多代理场景训练利用训练的模型运行推理Codelets模拟Isaac SDK 中的健身房状态机流程强化学习政策JSON 管…

Jenkins+GitLab自动化部署到Docker容器

JenkinsGitLab自动化部署到Docker容器1、编写Dockerfile2、为测试服务器配置Docker镜像加速器3、Jenkins相关配置3.1 配置测试服务器3.2 Pre Steps配置3.3 Post Steps配置3.4 执行构建本文是对JenkinsGitMaven自动化部署配置这篇文章的补充,有关基本的环境搭建从这篇…

Python的 6 大类数据类型,先收藏再说......

计算机程序,就是对数据进行操作。 无论你学习那种语言开发,都需要学习具体的数据类型, 每种开发语言都有自己不同数据类型。 下面是针对python语言的全部数据类型详细汇总: Python中可以自定义数据类型,可以具有无限种数据类型…

爱普生Epson WF110彩色无线便携式打印机错误E-12维护箱已到使用寿命

基本参数: 产品定位 墨仓式打印机 最高分辨率(dpi) 5760X1440dpi 网络功能 支持无线网络打印

【MySQL】成为MySQL高手必须要知道的MySQL索引

MySQL基础mysql 的查询流程索引是什么呢?MySQL索引优缺点MySQL索引分类上一篇了解到了MySQL安装步骤,接下来就开始学习MySQL索引知识点 mysql 的查询流程 查询流程大致是: mysql 客户端通过协议与 mysql 服务器建连接,发送查询…

Lesson 4.6 逻辑回归的手动实现

文章目录一、逻辑回归损失函数的梯度计算表达式二、创建分类数据集生成器1. 手动创建分类数据2. 创建分类数据生成器三、逻辑回归的手动实现四、逻辑回归的分类性能瓶颈与算法评价讨论完梯度下降的相关内容之后,接下来我们尝试使用梯度下降算法求解逻辑回归损失函数…

Microsoft Office( Word、Excel、PowerPoint)的安装

1 下载Office Tool Plus 官网地址:点击下载 2 点击Office Tool Plus.exe 3 接受软件许可条款和Microsoft服务协议 4 点击安装Office 5 选择Office 专业增强版 2019 6 确认安装Office 专业增强版 2019 7 关闭安全中心警报 8 等待安装完成 9 点击关闭 10 点击返回…

VMware创建Ubuntu系统

Ubuntu镜像可以去各个镜像网站下载 官网:https://ubuntu.com/ 中文官网:https://cn.ubuntu.com/ 镜像下载 使用Ubuntu在开发的时候下载LTS版本,也可以下载其他版本以及历史版本 这里面使用的镜像是ubuntu-16.04.7-desktop-amd64.iso版本&a…

1月书单 2月新书预告 | 百万册畅销书全新续作来啦

幸福而忙碌的 1 月一溜烟就跑走了,我们已经来到 2 月的第 1 天。最近,公司楼下售卖咖啡的地方,总是排着长长的队……想必不少小伙伴还在找状态。 图灵君先带大家回忆一下 1 月我们上新了哪些书。 01 《这才是服务设计》 作者:[德…

章节9 软件安装

9-Linux软件安装 01 软件为什么需要安装 Windows软件安装流程 安装检查释放文件复制可执行文件DLL动态链接库/安装服务注册表开始菜单和快捷方式 Windows安装文件 Windows可执行文件 Linux可执行程序 /bin /sbin /usr/bin /usr/sbin 02 脚本和程序的区别 脚本和程序的…

录屏可以录声音吗?录制带声音的视频,这个方法轻松解决

​很多小伙伴对电脑屏幕进行录制的时候,却发现自己辛苦录制的视频没有录到声音。录屏可以录声音吗?当然可以!只需要使用录屏软件进行录制就可以解决。还不知道录屏可以录声音的小伙伴快来看看吧。 一、录屏可以录声音吗? 很多小伙…

MySQL-如何分库分表?一看就懂

一、为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从)&…