数据库查询优化器,RBO优化规则介绍及示例

本文介绍了数据库查询优化器中的RBO(Rule-Based Optimization)规则,包括子查询优化、视图重写、表达式简化和连接优化等方面。RBO在不需要代价估算的情况下提升SQL性能,虽然其优化结果可能不是全局最优,但在很多场景下仍能显著改善查询效率。文中还讨论了RBO框架的问题,以及现代数据库倾向于使用CBO的原因。
摘要由CSDN通过智能技术生成

数据库查询优化器是针对于sql经过解析后生成的ast表达式树的。

目的是能够降低sql执行计算量,简化计算。

传统数据库中,查询优化是很复杂的,大体上可以分为RBO和CBO,其中CBO的收益性不确定,需要进行代价估算,依赖的数据统计会比较多。而RBO规则优化在不需要了解数据统计信息的前提下,可以明确提升sql执行计划的查询性能。

现在的数据库厂商大多使用的是RBO+CBO或者只用CBO的架构。其实只用CBO更主流一些,TIDB,PolarX都在用,只用cbo搜索空间相对更完整,优化结果更接近全局最优。可扩展性更好,对于新规则的添加更简单。

但是相对的,搜索空间会更大,查询优化过程耗时相对更长。优化结果更依赖搜索算法的好坏。而RBO的查询优化耗时更短,RBO能够带来明确收益,虽然优化结果局部最优,但与全局最优解不会相差很多(在CBO阶段优化了最耗时部分,保证最耗时的规则范围内达到最优)。

我经验有限,这里只是写一下自己了解到的RBO优化规则。这里会大量参考李海翔大佬的《数据库查询优化器的艺术》,tidb的分享文章等等。

目录

逻辑查询优化技术(RBO)的理论基础

子查询优化

子查询的分类

子查询展开

常见的子查询类型优化

mysql和pg的支持项

视图重写优化

等价谓词重写

表达式优化及条件化简

单个表达式的简化

多个表达式之间的简化

pg,mysql,ck支持项

连接相关优化

1.外连接消除

外连接到内连接的转化

外连接消除 

2.嵌套连接优化

3.pg,mysql,ck 连接优化

列裁剪优化

算子下推

1.谓词下推

where谓词/having谓词下推场景

join on谓词下推场景

2.TopN和Limit下推(分布式场景)

max/min消除

3.聚合下推

RBO优化框架的问题


逻辑查询优化技术(RBO)的理论基础

常见的优化规则包括:

  1. sql子句局部优化。比如等价谓词重写、谓词化简等。
  2. 子句之间关联的优化。比如外链接消除、子查询优化等。
  3. 局部与整体优化。比如or重写成union。
  4. 形式变化优化。比如通过形式变化进行嵌套连接消除。
  5. 语义优化。根据完整性约束,sql表达含义等信息来进行语义优化。
  6. 其他优化。根据一些规则对非SPJ(select,project,join结合的查询)做的其他优化等。

查询优化技术的理论基础是关系代数。关系数据库基于关系代数。

  • 关系模型数据结构就是关系数据库中的二维结构。
  • 关系是一种对象,偏于理论。表也是,但偏于工业。
  • 表中元数据通常用field或者item来表示。
  • 表中行数据通常用tuple,row,record等来表示。
  • 对关系进行的运算就是关系运算。运算对象,运算符,运算结果是运算的三大要素。

关系代数运算符包括4类:

  • 传统集合运算符。并(union),交(intrsection),差(difference),积。
  • 专门的关系运算符。select,投影(project),连接(join),除(divide)。
  • 辅助运算符。算数比较符和逻辑运算符。
  • 关系扩展运算符。比如semi join,extend等。

基本关系运算与对应的sql表

关系代数运算符           对应sql语句
∪ (UNION)并 select * from t1 UNION select * from t2;
∩ (INTERSECTION)交 select * from t1 where t1.id in (select id from t2);
-  (DIFFERENCE)差 select * from t1 where t1.id not in (select id from t2);
× (Cartesian PRODUCT)笛卡尔积    select * from t1,t2;
π (PROJECT)投影           select id,name from t1;
σ (SELECT)选择            select * from t1 where id>10;
⋈ (JOIN)链接   select * from t1 join t2 on t1.id=t2.id;
÷ (DIVISION)除 select * from t1 where not exists (select t2.id from t2 where t2.id!=t1.id);

 

子查询优化

子查询的分类

子查询可以出现在sql中的位置如下:

子查询出现位置

对优化的影响
目标列 必须为标量子查询
from子句

不能有关联子查询。

非关联子查询可上拉到父查询。

where子句 根据数据类型和操作符不同,对子查询的格式有要求。
join on子句

join中同from条件。

on中同where条件,但是具体实现有些许不同。

group by 子句

需要和目标列关联(sql规范)。

直接写在groupby无实用意义。

having子句 同where语句。
order by子句 无实用意义

子查询的分类如下:

分类方式 子查询名称 介绍
关系对象之间的关系 关联子查询 依赖外层父查询属性值
非关联子查询 不依赖外层父查询属性值
通过谓词分类 [not] in  in子查询
[not] exists  exists子查询
其他子查询 除上述外的其他子查询
语句构成复杂度 SPJ子查询 选择/投影/连接 基础语句组合的子查询
GROUP BY子查询 SPJ + 聚合 组合的子查询
其他子查询 包含更多其他语句,比如limit ,order by之类的子查询
从结果集来分类 标量子查询 返回结果为单一值
列子查询 返回结果为单一列,但多行
行子查询 返回结果为单一行,但多列
表子查询 返回结果多行多列

子查询展开

常见的子查询优化技术包括:

  • 子查询合并。指产生同样结果集的子查询合并成一个子查询。
  • 子查询展开。后面详细说。
  • 聚合子查询消除。将子查询转换为不包含聚合函数的子查询。
  • 其他。利用窗口函数等来优化子查询。

最重要的是子查询展开。最为常用。实质是将某些子查询重写为多表连接的操作。可以将查询层次减少。

子查询展开有两种形式:

  1. 如果子查询中出现了聚集,group by,distinct语句,只能单独求解,无法拉到上层。
  2. 为SPJ格式的查询,则可以拉到上层。这个也是子查询展开的处理范围。

把子查询上拉,前提是上拉后展开结果不能带来多余的元组(ROW)。所以子查询展开的规则如下:

  1. 如果上层查询结果没有重复(唯一键,主键等)。则可以展开子查询,展开后查询的select需要添加distinct。
  2. 如果上层查询结果包含distinct,可以直接进行子查询展开。
  3. 如果内层查询结果没有重复,可以展开。

子查询展开步骤如下:

  1. 子查询和上层子查询的from语句合并成为一个from语句,修改相应的运行参数。
  2. 修改子查询的谓词符号。
  3. 合并子查询和上层查询的where条件。

常见的子查询类型优化

1.in子查询的优化

最低0.47元/天 解锁文章
数据库查询优化器艺术
11-21
数据库查询优化器的艺术,深入剖析数据库查询器实现源码及原理。
项目数据库优化
10-08
Oracle数据库提供了两种类型的优化器:基于规则优化器RBO)和基于代价的优化器(CBO)。其中,CBO因其智能选择最优执行路径的能力,在Oracle 8i及后续版本中成为默认配置,并在10g版本中彻底淘汰了RBO的维护和...
Mysql查询优化器
caomiao2006的专栏
08-14 1537
Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率。那么到底mysql到底能进行哪些优化那,下面通过以下几个方面来探讨一下: 1          常量转化  它能够对sql语句中的常量进行转化,比如下面的表达式: WHERE col1 = col2
DB2数据库查询过程(Query Processing)----概述
weixin_30666401的博客
11-10 473
引言 我们知道,目前通用的数据库查询语言是SQL语言(Structured Query Language)。SQL语言也是一种编译型语言,需要SQL编译器编译后才能执行,但它与C、C++、Java等语言不同,SQL语言是一种非过程化语言,这意味着使用SQL进行操作的时候,你只需要指定你要达到什么目的,而无需指明要怎样达到目的。比如要查询EMPLOYEE的所有行,使用语句“Select * Fro...
mysql的查询优化器_MySQL查询优化之查询优化器 | 学步园
weixin_33514163的博客
01-19 381
MySQL查询优化之查询优化器phpma.com当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将介绍查询优化器是如何工作的。如果你想知道MySQL采用的优化手段,可以查看MySQL参考手册。phpma.com当然,MySQL查询优化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查询,那么无论数据表有多大,MySQL执行它的速...
mysql优化器RBO_mysql查询优化器
weixin_36331764的博客
02-04 492
引用连接 https://www.cnblogs.com/lbg-database/p/10108513.html优化器分类传统关系型数据库里面的优化器分为CBO和RBO两种。RBO— Rule_Based Potimizer 基于规则优化器:RBO :RBO所用的判断规则是一组内置的规则,这些规则是硬编码在数据库的编码中的,RBO会根据这些规则去从SQL诸多的路径中来选择一条作为执行计划(比如...
Oracle实战优化器
03-05
当我们使用RBO进行查询时,优化器会根据预先设定的规则来选择执行计划。例如,在以下查询中,尽管ID=99的记录很少,但由于使用了RBO,可能会选择全表扫描而不是索引扫描。 ```sql set autotrace trace explain ...
oracle_优化器详解
09-02
Oracle数据库优化器数据库管理系统中的一个关键组件,它负责分析SQL语句,并选择最有效的执行计划来执行这些语句。优化器的目标是根据不同的需求(如最佳吞吐量或最快的响应时间)来选择最佳的查询执行策略。 ###...
Oracle的优化器(Optimizer)
07-04
### Oracle的优化器(Optimizer)详解 #### 一、Oracle优化器概述 在Oracle数据库中,每当执行SQL语句时,系统...通过合理配置优化器参数、定期更新统计信息以及适当使用提示(Hint),可以显著提升数据库查询的性能。
Oracle SQL性能优化技巧大总结
08-17
**背景**:在基于规则优化器RBO)中,Oracle解析器处理FROM子句中的表名是从右向左的。为了提高查询效率,需要合理安排表的顺序。 **技巧详解**: 1. **基础表的选择**:对于多个表的连接查询,选择记录条数...
SQL优化-优化器
weixin_50742675的博客
12-09 1443
SQL优化-优化器
数据库之查询优化器
最新发布
m0_51909458的博客
03-19 745
数据库包括三个部分:语法分析器、优化器、执行引擎。其中优化器的作用是把关系表达式通过等价转换为查询树,寻找最优路径,生成最优执行计划,很大程度上决定了数据库的性能。
数据库查询优化器
悠悠的博客
01-09 343
查询优化器两种分类: 1、RBO:Rule-Based Optimizer 基于规则优化器 这是一种比较老的技术,简单说基于规则优化就是当数据库执行一条query语句的时候必须遵循预先定义好的一系列规则来确定执行过程,它不关心访问表的数据分布情况,仅仅凭借规则经验来确定,所以说是一种比较粗放的优化策略。 RBO所用的判断规则是一组内置的规则,这些规则是硬编码在数据库的...
mysql 查询优化器_数据库查询优化器
weixin_28894541的博客
01-25 157
所谓查询优化,目标是关系数据库下或者 newSQLSQL Server 层对 SQL 语句进行优化,在不改变期望结果的情况下使得数据库引擎计划执行时间最短。狭义的查询优化技术是指逻辑优化与物理优化(在后面会细讲),广义上的查询优化技术包括从 SQL 语句输入开始,对 SQL 语句的重写,内部执行算法的优化,并行优化及分布式条件下的优化,还包括了外部缓存机制对于查询计划及查询结果的重用。查询优...
sql优化之查询优化器
qq_37436172的博客
07-03 1664
本文大部分内容引用自代码搬运工.-MYSQL查询优化器 看本篇之前推荐看 innodb数据结构,缓冲区 熟悉数据库存数结构MySQL 使用典型的客户端/服务器(Client/Server)结构, 体系结构大体可以分为三层:客户端、服务器层以及存储引擎层。其中,服务器层又包括了连接管理、查询缓存 、SQL 接口、解析器、优化器、缓冲与缓存以及各种管理工具与服务等。逻辑结构图如下所示: 具体来说,每个组件的作用如下:客户端,连接 MySQL 服务器的各种工具和应用程序。例如 mysql 命令行工具、mysql
数据库-优化器
m0_61567378的博客
10-14 453
不同的查询树会对数据操作的效率产生重大影响,因此我们需要构造出所有可能的查询树,并计算不同查询树的执行效率,选择最优的查询树。首先在二级索引中根据条件查数据的IO成本,一般是看查询条件涉及到几个范围,比如某个字段涉及到两个区间,那么就是两个范围,如果是等值查询就只有一个范围区间,全表查询会计算将聚簇索引的所有页子节点数据页全部读取到内存中的开销,有多少的数据页就有多少的IO成本,每个记录都有0.2的CPU开销。计算出全表扫描,使用各个索引查询的成本之后,比对各个执行计划的成本,然后找出最低的执行计划。
数据库优化器
JohnWang1124的博客
03-07 1119
数据库优化器在我看来就好比是人的大脑。当我们的用户(可能是一条sql也可能是一个application,也可能是多个sql,多个application)在访问数据库的时候,优化器会给sql或者是app的请求提供最优质的服务。SQL是结构化的查询语言,他在执行的时候也是需要编译才能够被系统识别的,但是不同于其他面向对象或者是过程的开发语言,SQL并不要制定访问逻辑,你需要做的只是告诉数据库你要得到
mysql数据库优化器_解决MySQL数据库中与优化器有关的问题
weixin_36243860的博客
01-19 128
来源:互联网作者:若水2008-03-19/09:17MySQL采用了基于开销的优化器,以确定处理查询的最解方式。在很多情况下,MySQL能够计算最佳的可能查询计划,但在某些情况下,MySQL没有关于数据的足够信息,不得不就数据进行“有教养”的估测。当MySQL未能做“正确的”事时,可使用下述工具来帮助MySQL:使用EXPLAIN语句获取关于MySQL如何处理查询的信息。要想使用它,可在SELE...
【转】 oracle数据库的CBO和RBO优化器
paldosfan的专栏
09-14 154
ORACLE 提供了CBO、RBO两种SQL优化器。CBO在ORACLE7 引入,但在ORACLE8i 中才成熟。ORACLE 已经明确声明在ORACLE9i之后的版本中(ORACLE 10G ),RBO将不再支持。因此选择CBO 是必然的趋势。 CBO和 RBO作为不同的SQL优化器,对SQL语句的执行计划产生重大影响,如果要对现有的应用程序从RBO向CBO移植,则必须充分...
写文章

热门文章

  • 掌握14种UML图,清晰图示 149807
  • 三种存储类型:块存储、文件存储、对象存储 24795
  • go time.Sleep睡眠指定时间(小时级到纳秒级) 17463
  • clickhouse配置项config.xml详解——服务器配置参数 15696
  • python中的线程threading.Thread()使用详解 12749

分类专栏

  • docker 1篇
  • go 35篇
  • 调试工具 12篇
  • 测试调研 11篇
  • postgresql 19篇
  • python 10篇
  • 数据库架构 19篇
  • 算法 17篇
  • k8s 10篇
  • 不务正业 1篇
  • clickhouse 36篇
  • c++ 13篇
  • 读书笔记 14篇
  • git 1篇
  • linux 11篇
  • mysql 24篇
  • 面试 6篇
  • sql查询优化 2篇
  • zookeeper 1篇
  • 设计模式 12篇
  • 网络协议 2篇
  • tidb 3篇
  • shell 3篇
  • 分布式 5篇
  • raft协议 6篇
  • spark 1篇
  • citus 3篇

最新评论

  • 掌握14种UML图,清晰图示

    67658: 多谢提醒,也给你点个

  • 掌握14种UML图,清晰图示

    liuxiaoye666: 第一句话就写错,是modeling,,。。,

  • 掌握14种UML图,清晰图示

    studying chaofan: 谢谢

  • 掌握14种UML图,清晰图示

    (CC.: 用例图不是结构图吗

  • postgresql的pg_wal日志

    qq_41598508: 您好,这个data buffer是什么

最新文章

  • 记在2023/8/24
  • docker之WORKDIR指令
  • 解决Golang获取当前项目绝对路径问题
2023年15篇
2022年94篇
2021年47篇
2020年54篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码盐田百度关键词包年推广广州网络广告推广同乐网站优化按天计费木棉湾企业网站改版坑梓百度标王坪地营销网站松岗网站设计模板福永关键词按天扣费深圳模板推广福田关键词按天扣费盐田百度seo民治网站制作设计坪地企业网站制作光明高端网站设计大运网站优化按天收费惠州模板网站建设永湖企业网站建设横岗阿里店铺运营龙华网站搜索优化西乡营销网站同乐关键词按天收费同乐百度竞价沙井企业网站设计塘坑网站制作设计惠州seo网站推广坪地企业网站制作沙井企业网站改版松岗百搜标王南山网站推广双龙网站优化按天收费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化