动手学大数据-2常见的查询优化器

server/2025/1/18 5:02:53/

目录

什么是查询优化

查询优化器分类 

 Top-downOptimizer

Bottom-upOptimizer

RBO-关系代数  

RBO-优化原则 

RBO-列裁剪

 RBO-谓词下推

RBO-传递闭包 

RBO-RuntimeFilter

小结 

CBO(Cost-basedOptimizer)

概念 

CBO-统计信息 

CBO-统计信息的收集方式 

CBO-统计信息推导规则 

CBO-统计信息的问题 

CBO-执行计划枚举

CBO执行计划枚举-动态规划 ​编辑

 CBO效果-TPC-DSQ25

CBO效果-TPC-DS 

CBO小结 

小结


什么是查询优化

前面我们说到了查询的流程:

语法分析:检查SQL拼写和语法是否有问题。

语义检查:检查SQL语句中的访问对象是否存在,即表名、列名啥的;

经过语法分析和语义检查无误之后,就会生成一棵语法分析树,进行优化器优化,生成查询计划。

所以,查询优化器的目标就是找到当前SQL查询的最佳执行计划(或者说查询树),它是由一系列物理操作符组成,这些操作符按照一定的运算关系组成查询的执行计划。

而在查询优化器中,可以分为逻辑优化阶段和物理优化阶段。
 

逻辑优化,就是通过改变SQL语句的内容来使得查询更加高效,并为物理优化阶段提供更多的候选执行计划。

那逻辑优化是如何改变SQL语句的内容呢?

通常采用的方式是对SQL语句进行等价变换,(基于关系代数)做查询重写。比如说,对条件表达式做等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行外连接消除、嵌套连接消除等。

逻辑优化中的每一步都对应着物理计算,因此逻辑优化阶段输出若干候选执行计划之后,物理优化阶段会计算这些计划的代价,从中选择代价最小的作为执行计划。

因此逻辑优化属于语法层级的优化,而物理优化实际上是一种依据代价的估算模型,相当于是从连接路径中选择代价最小的路径,因此属于物理层面的优化。

查询优化器分类 

 Top-downOptimizer

从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划

例子:Volcano/Cascade,SQLServer

Bottom-upOptimizer

从零开始,由下往上遍历计划树,找到完整的执行计划

例子:SystemR,PostgreSQL,IBMDB2

Rule-basedOptimizer(RBO)

根据关系代数等价语义,重写查询

基于启发式规则会访问表的元信息(catalog),不会涉及具体的表数据(data)

Cost-basedOptimizer(CBO)

使用一个模型估算执行计划的代价,选择代价最小的执行计划 

RBO-关系代数  

RBO: Rule-Based Optimization也即“基于规则的优化器”,该优化器按照硬编码在数据库中的一系列规则来决定SQL的执行计划。

以Oracle数据库为例,RBO根据Oracle指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中:索引的优先级大于全表扫描。

通过Oracle的这个例子我们可以感受到,在RBO中,有着一套严格的使用规则,只要你按照规则去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”。这就要求开发人员非常了解RBO的各项细则,不熟悉规则的开发人员写出来的SQL性能可能非常差。

但在实际的过程中,数据的量级会严重影响同样SQL的性能,这也是RBO的缺陷所在。毕竟规则是死的,数据是变化的,所以RBO生成的执行计划往往是不可靠的,不是最优的。

变为: 

RBO-优化原则 

Readdatalessandfaster(I/O)

Transferdatalessandfaster(Network)

Processdatalessandfaster(CPU&Memory) 

优化前的逻辑计划:

下面给出四个优化规则: 

RBO-列裁剪

 

对应的算子有没用到的列,实际中就去掉这些列,这样就减少复杂度 

 RBO-谓词下推

尽早地过滤数据,也就是提前将id>123的数据过滤出来了,也会减少复杂度 

RBO-传递闭包 

根据表达式子中的pv.userId = user.id条件,其实可以推出 pv.userId也是可以筛选出大于123的数据 

 

RBO-RuntimeFilter

 

小结 

 

CBO(Cost-basedOptimizer)

概念 

使用一个模型估算执行计划的代价,选择代价最小的执行计划

执行计划的代价等于所有算子的执行代价之和

通过RBO得到(所有)可能的等价执行计划

算子代价:CPU,内存,磁盘I/O,网络I/O等代价

和算子输入数据的统计信息有关:输入、输出结果的行数,每行大小...

叶子算子Scan:通过统计原始表数据得到

中间算子:根据一定的推导规则,从下层算子的统计信息推导得到

和具体的算子类型,以及算子的物理实现有关

例子:SparkJoin算子代价=weight*row_count+(1.0-weight)*size 

 

CBO-统计信息 

原始表统计信息

表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等

列级别:min、max、numnulls、numnotnulls、numdistinctvalue(NDV)、histogram等

推导统计信息

        选择率(selectivity):对于某一个过滤条件,查询会从表中返回多大比例的数据

        基数(cardinality):在查询计划中常指算子需要处理的行数 

 

CBO-统计信息的收集方式 

在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息

手动执行explainanalyzestatement,触发数据库收集或者更新统计信息 

 

动态采样 

CBO-统计信息推导规则 

 假设列和列之间是独立的,列的值是均匀分布

 

CBO-统计信息的问题 

假设列和列之间是独立的,列的值是均匀分布 -->这个假设经常与现实不符 

 

CBO-执行计划枚举

 

通常使用贪心算法或者动态规划选出最优的执行计划 

CBO执行计划枚举-动态规划 

 

 

 

 

 

 

 CBO效果-TPC-DSQ25

 

 

 

CBO效果-TPC-DS 

 

 

CBO小结 

 CBO使用代价模型和统计信息估算执行计划的代价

CBO使用贪心或者动态规划算法寻找最优执行计划

在大数据场景下CBO对查询性能非常重要

小结

主流RBO实现一般都有几百条基于经验归纳得到的优化规则

RBO实现简单,优化速度快

RBO不保证得到最优的执行计划

CBO使用代价模型和统计信息估算执行计划的代价

CBO使用贪心或者动态规划算法寻找最优执行计划

大数据场景下CBO对查询性能非常重要 

 

 

 


http://www.ppmy.cn/server/159265.html

相关文章

Scala 提取器(Extractor)

Scala 提取器(Extractor)是一个重要的概念,它主要用于从对象中提取出构造该对象时所用的参数。在 Scala 中,提取器通常是一个带有 unapply 方法的单例对象。这个 unapply 方法是 apply 方法的反向操作:apply 方法接受参…

算法——归并排序(基本思想、java实现、实现图解)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

DNS介绍与部署-Day 01

1. 什么是DNS DNS(Domain Name System)域名系统,是一种采用客户端/服务器机制,负责实现计算机名称与IP地址转换的系统。DNS作为一种重要的网络服务,既是Internet工作的基础,同时在企业内部网络中也得到了广…

前后端分离开发心得

前后端分离开发是一种软件开发模式,将前端和后端的开发分离开来,使得前端和后端可以独立开发、测试和部署。具体来说: • 前端:负责展示数据和用户交互,使用 HTML、CSS、JavaScript 等技术实现用户界面和交互逻辑&…

向量数据库如何助力Text2SQL处理高基数类别数据

01. 导语 Agent工作流和 LLMs (大语言模型)的出现,让我们能够以自然语言交互的模式执行复杂的SQL查询,并彻底改变Text2SQL系统的运行方式。其典型代表是如何处理High-Cardinality Categorical Data (高基数类别数据&am…

SVM支持向量机

目录 算法原理 数学基础 向量内积(向量点乘) 范数 对偶问题 拉格朗日乘子法 ​线性可分与线性不可分 线性可分 线性不可分 超平面 超平面的定义 超平面的作用 如何寻找最优的超平面 损失函数求解 软间隔 鲁棒性 核函数 算法优缺点 优点…

运输层安全协议SSL

安全套接字层 SSL (Secure Socket Layer) SSL 作用在端系统应用层的 HTTP 和运输层之间,在 TCP 之上建立起一个安全通道,为通过 TCP 传输的应用层数据提供安全保障。 应用层使用 SSL 最多的就是 HTTP,但 SSL 并非仅用于 HTTP,而是…

Coconut:基于连续潜在空间推理,提升大语言模型推理能力的新方法

Coconut(连续思维链)提出了一种新的大语言模型推理范式,该范式在潜在空间中进行运算,利用模型隐藏层生成的连续思维状态取代传统的基于文本的推理方式。系统将这些状态以输入嵌入的形式反馈至模型,通过广度优先搜索方法…