SQL优化系列——查询优化器
大多数查询优化器将查询计划用“计划节点”树表示。计划节点封装执行查询所需的单个操作。节点被布置为树,中间结果从树的底部流向顶部。每个节点具有零个或多个子节点 - 这些子节点是输出作为父节点输入的节点。例如,连接节点将具有两个子节点,它们表示两个连接操作数,而排序节点将具有单个子节点(要排序的输入)。树的叶是通过扫描磁盘产生结果的节点,例如通过执行索引扫描或顺序扫描。
连接排序
查询计划的执行主要取决于表的连接顺序。例如,当分别连接大小为10行,10,000行和1,000,000行的3个表A,B,C时,首先将B和C连接起来的查询计划需要执行时间可能比先连接A和C多几个数量级的时间。大多数查询优化器通过由IBM的System R数据库项目开创的动态规划算法确定连接顺序。该算法分为两个阶段:
1,首先,计算查询中每个关系访问所有方法。可以通过顺序扫描访问查询中的每个关系。如果关系中有一个索引可以用来回答查询中的谓词,也可以使用索引扫描。对于每个关系,优化器记录扫描关系的最便宜方法,以及扫描以特定排序顺序生成记录的关系的最便宜方式。
2,优化器然后考虑组合存在连接条件的每对关系。对于每一对,优化器将考虑由DBMS实现的可用连接算法。除了以最便宜方式加入根据特定排序顺序生成其输出的每对关系之外,它将保留加入每对关系的最便宜方式。
3,然后,通过将上一阶段生成的双关系计划与查询中的剩余关系相加来计算所有三关系查询计划。
排序顺序可以避免在处理查询后进行冗余排序操作。第二,特定的排序顺序可以加速后续联接,因为它以特定的方式聚集数据。
嵌套SQL查询的查询规划
对现代关系DBMS的SQL查询不仅仅是选择和连接。 特别地,SQL查询通常通过分组进行存在或不存在操作,所以嵌套多个SPJ块(Select-Project-Join)层。 在某些情况下,这样的嵌套SQL查询可以被平坦化为select-project-join查询,但并不总是。 也可以使用与连接排序相同的动态编程算法来选择嵌套SQL查询的查询计划,但这可能会导致更多查询优化时间。 因此,一些数据库管理系统使用使用查询图模型的替代的基于规则的方法。
费用估算
查询优化中最困难的问题之一是准确估计替代查询计划的成本。优化器使用查询执行成本的数学模型对查询计划进行成本,这大大依赖于查询计划中流经每个边缘的基数或元组数量的估计。基数估计依赖于查询中谓词选择因子的估计。传统上,数据库系统通过对各列中值的分布进行相当详细的统计来估计选择性,如直方图。这种技术对于各个谓词的选择性的估计效果很好。然而,许多查询具有联系的谓词,例如select count(*) from R where R.make='Honda' and R.model='Accord'。查询谓词通常是高度相关的(例如,model ='Accord'意味着make ='Honda'),并且很难估计结合的选择性。查询优化器选择较差的查询计划的主要原因之一是基数估计和未被捕获的相关性较差。这就是为什么数据库管理员应该定期更新数据库统计信息的原因之一,特别是在主要数据加载/卸载之后。
古典查询优化假设查询计划根据一个单一成本度量,通常是执行时间进行比较,并且每个查询计划的成本可以在不确定的情况下进行计算。这两个假设有时在实践中被违反[,并且在克服这些限制的研究文献中已经研究了经典查询优化的多个扩展。这些扩展的问题变体在如何模拟单个查询计划的成本以及其优化目标方面有所不同。
参数化查询优化
古典查询优化将每个查询计划与一个标量成本值相关联。参数查询优化假设查询计划成本取决于优化时间未知的参数。例如参数是可变的查询谓语表示在优化时间未完全指定但将在执行时提供。因此,参数查询优化将每个查询计划与从多维参数空间映射到一维成本空间的成本函数相关联。
优化的目标通常是生成可以优化的任何参数值组合的所有查询计划。这产生一组相关的查询计划。在运行时,一旦知道真实参数值,就从该组中选出最佳方案。参数查询优化的优点是在运行时避免了优化(通常是非常昂贵的操作)。
多个目标的查询优化
除了执行时间之外,还有其他成本指标与比较查询计划相关。例如,在云计算方案中,应该比较查询计划,不仅在执行时间多少,还要考虑执行成本多少钱。或者在近似查询优化的上下文中,可以对随机选择的输入数据样本执行查询计划,以便在减少执行开销的情况下获得近似结果。在这种情况下,替代查询计划必须在其执行时间方面进行比较,而且还要根据其生成的数据的精度或可靠性进行比较。
多目标查询优化将查询计划的成本建模为成本向量,其中每个向量分量根据不同的成本度量代表成本。经典查询优化可以被认为是多目标查询优化的特殊情况,其中成本空间的维度为一(即,成本矢量分量的数量)。
不同的成本指标可能会相互冲突(例如,可能有一个计划的执行时间最短,并且在云计算方案中具有最小的货币执行费用的不同计划)。因此,优化的目标不能是找到最小化所有成本指标的查询计划,而是必须找到实现不同成本指标之间最佳折衷的查询计划。什么最好的妥协取决于用户偏好(例如,一些用户可能更喜欢更便宜的计划,而另一些用户喜欢在云方案中更快的计划)。因此,优化的目标是根据作为优化器的输入提供的用户偏好的一些规范来找到最佳查询计划(例如,用户可以定义不同成本度量之间的权重来表示相对重要性或在某些度量上定义硬成本界限)或者产生一组帕累托最优查询计划的近似值(即,计划,使得没有其他计划根据所有度量具有更好的成本),使得用户可以从该计划集合中选择优选成本折衷。
多目标参数查询优化多目标参数查询优化[1]概括了参数和多目标查询优化。计划根据多个成本指标进行比较,计划成本可能取决于优化时间值未知的参数。因此,查询计划的成本被建模为从多维参数空间到多维成本空间的函数。优化的目标是生成对于参数值和用户偏好的每个可能组合可以是最佳的查询计划集合。
多个目标的参数化查询优化
多目标参数查询优化概括了参数化和多个目标的查询优化。 计划根据多个成本指标进行比较,计划成本可能取决于优化时间值未知的参数。 因此,查询计划的成本被建模为从多维参数空间到多维成本空间的函数。 优化的目标是生成对于参数值和用户偏好的每个可能组合可以是最佳的查询计划集合。
翻译自https://en.wikipedia.org/wiki/Query_optimization#General_consideration
SQL优化系列——查询优化器的更多相关文章
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
- SQL优化系列(三)- 用最少的索引获得最大的性能提升
从全局出发优化索引 对于高负载的数据库,如何创建最少的索引,让数据库的整体性能提高呢?例如,对于100 条SQL语句,如何创建最佳的5条索引? SQL自动优化工具SQL Tuning Expert P ...
- SQL优化系列(二)- 优化Top SQL
优化最耗资源的N条SQL语句 如何从SGA或者AWR中找出最消耗资源的SQL, 例如最慢的20条SQL, 然后逐条优化? SQL自动优化工具SQL Tuning Expert Pro for Orac ...
- SQL优化系列(一)- 优化SQL
优化SQL SQL开发人员从源代码中发现一条跑得很慢的SQL, 如何优化? DBA从AWR报告中发现一条跑得很慢的SQL,没有源代码或者不想修改源代码怎么办? SQL自动优化工具SQL Tuning ...
- [译]SQL Server 之 查询优化器
因为生成查询计划的代价比较大,所以查询计划将会被缓存. 树形结构 SQL 查询首先被转化为树形结构,每个节点都是一个查询操作.例如: SELECT * FROM Customers C INNER J ...
- sql优化系列3(收集来源http://bbs.csdn.net/topics/250004467)
如何加快查询速度? 1.升级硬件 2.根据查询条件,建立索引,优化索引.优化访问方式,限制结果集的数据量. 3.扩大服务器的内存 4.增加服务器CPU个数 5.对于大的数据库不要设置数据库自动增长 ...
- sql优化系列1
sql中索引是否会用到,进而影响查询效率. 带通配符(%)的like语句 1.不能用null作索引,任何包含null值的列都将不会被包含在索引中.即使索引有多列这样的情况下,只要这些列中有一列含有nu ...
- sql优化系列2
sql中索引是否会用到,进而影响查询效率. 带通配符(%)的like语句 1.不能用null作索引,任何包含null值的列都将不会被包含在索引中.即使索引有多列这样的情况下,只要这些列中有一列含有nu ...
- Mysql优化(出自官方文档) - 第一篇(SQL优化系列)
Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...
随机推荐
- 再回首 基本数据类型和 if语句
一 变量:(使用变量是不能加引号,要不就变成字符串了) 变量的命名规则: 1.数字,字母,下划线组成. 2.变量不能是数字开头 3.区分大小写 4.不要使用中文或者拼音 5.要有相应的意义 6.不能使 ...
- Go Example--数组
package main import "fmt" func main() { //定义一个数组并完成初始化,初始值为对应的零值 var a [5]int fmt.Println( ...
- 【TCP/IP】二、协议的概念
一.概念 1.tcp/ip是通信协议的统称. 2.协议就是计算机与计算机之间通过网络实现通信时,事先达成的一种约定.这种约定,使那些不同厂商的设备,不同的CPU以及不同的操作系统组成的计算机之间,只要 ...
- jdreact转换为H5注意事项
1:先执行npm install 然后执行 npm run web-init 配置完后 在执行 npm run web-start(注意的是不要根据文档执行 yarn add -D @jdreact ...
- 用flask和长轮询实现对帅哥投票和实时查看票数
flask中的代码 from flask import Flask,request,render_template,redirect,session,jsonify import uuid impor ...
- RTP RTCP RTSP
1.RTP over UDP和RTP over RTSP有什么区别?2.RTP over RTSP是不是就是RTP over TCP?3.RTP over TCP 打包视频是不是要加4个字节的头,是 ...
- express 与 koa 区别
express 与 koa 区别 区别项 express koa 中间件模型 Compress 模型 洋葱圈模型 对象个数 只有2个对象:Request 和 Response 有3个对象:Reques ...
- vue 下实现 echarts 全国到省份的地图下钻
vue 下实现 echarts 全国到省份的地图下钻 项目地址:https://github.com/cag2050/vue_echarts_v3_demo
- C编程技巧资源
Keil C 位变量外部引用的方法 https://blog.csdn.net/zh458042230/article/details/8627604 单片机Keil C51 C语言多文件如何使用全局 ...
- 代码阅读笔记:【C-COT】
[C-COT]:Danelljan M, Robinson A, Khan F S, et al. Beyond correlation filters: Learning continuous co ...