大多数查询优化器将查询计划用“计划节点”树表示。计划节点封装执行查询所需的单个操作。节点被布置为树,中间结果从树的底部流向顶部。每个节点具有零个或多个子节点 - 这些子节点是输出作为父节点输入的节点。例如,连接节点将具有两个子节点,它们表示两个连接操作数,而排序节点将具有单个子节点(要排序的输入)。树的叶是通过扫描磁盘产生结果的节点,例如通过执行索引扫描或顺序扫描。

连接排序

查询计划的执行主要取决于表的连接顺序。例如,当分别连接大小为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优化系列——查询优化器的更多相关文章

  1. 【MySQL】SQL优化系列之 in与range 查询

    首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...

  2. SQL优化系列(三)- 用最少的索引获得最大的性能提升

    从全局出发优化索引 对于高负载的数据库,如何创建最少的索引,让数据库的整体性能提高呢?例如,对于100 条SQL语句,如何创建最佳的5条索引? SQL自动优化工具SQL Tuning Expert P ...

  3. SQL优化系列(二)- 优化Top SQL

    优化最耗资源的N条SQL语句 如何从SGA或者AWR中找出最消耗资源的SQL, 例如最慢的20条SQL, 然后逐条优化? SQL自动优化工具SQL Tuning Expert Pro for Orac ...

  4. SQL优化系列(一)- 优化SQL

     优化SQL SQL开发人员从源代码中发现一条跑得很慢的SQL, 如何优化? DBA从AWR报告中发现一条跑得很慢的SQL,没有源代码或者不想修改源代码怎么办? SQL自动优化工具SQL Tuning ...

  5. [译]SQL Server 之 查询优化器

    因为生成查询计划的代价比较大,所以查询计划将会被缓存. 树形结构 SQL 查询首先被转化为树形结构,每个节点都是一个查询操作.例如: SELECT * FROM Customers C INNER J ...

  6. sql优化系列3(收集来源http://bbs.csdn.net/topics/250004467)

    如何加快查询速度? 1.升级硬件   2.根据查询条件,建立索引,优化索引.优化访问方式,限制结果集的数据量. 3.扩大服务器的内存 4.增加服务器CPU个数 5.对于大的数据库不要设置数据库自动增长 ...

  7. sql优化系列1

    sql中索引是否会用到,进而影响查询效率. 带通配符(%)的like语句 1.不能用null作索引,任何包含null值的列都将不会被包含在索引中.即使索引有多列这样的情况下,只要这些列中有一列含有nu ...

  8. sql优化系列2

    sql中索引是否会用到,进而影响查询效率. 带通配符(%)的like语句 1.不能用null作索引,任何包含null值的列都将不会被包含在索引中.即使索引有多列这样的情况下,只要这些列中有一列含有nu ...

  9. Mysql优化(出自官方文档) - 第一篇(SQL优化系列)

    Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...

随机推荐

  1. 2017.4.28 KVM 内存虚拟化及其实现

    概述 KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机,越来越受到 IBM,Redhat,HP,Intel 等各大公司的大力支持,基于 KVM 的开源虚拟化生态系统也日 ...

  2. 08 正则表达式,Math类,Random,System类,BigInteger,BigDecimal,Date,DateFormat,Calendar

    正则表达式:    是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. public class Demo2_Regex { public sta ...

  3. 流程控制之if

    流程控制 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的.你要判断那条岔路是你真正要走的路,如果我们想让程序也 ...

  4. Go Example--协程

    package main import "fmt" func main() { //main gorouting中调用f函数 f("direct") //重新建 ...

  5. Redis 5.0.0 releases notes

    Redis 5.0 release notes ======================= ---------------------------------------------------- ...

  6. 【java多线程】java8的流操作api和fork/join框架

    原文:https://blog.csdn.net/u011001723/article/details/52794455/ 一.测试一个案例,说明java8的流操作是并行操作 1.代码 package ...

  7. webpack 搭建问题汇总

    总结一下遇到的问题: 1.这样的警告(The 'mode' option has not been set, webpack will fallback to 'production' for thi ...

  8. mongodb集群性能优化

    mongodb集群性能优化 在前面两篇文章,我们介绍了如何去搭建mongodb集群,这篇文章我们将介绍如何去优化mongodb的各项配置,以达到最优的效果. 警告 不做任何的优化,集群搭建完成之后,使 ...

  9. pycharm远程调试配置

    目录: 安装pycharm 配置pycharm远程调试 使用测试 一.安装pycharm(略) 二.配置pycharm远程调试 1.菜单--->Tools--->Deployment--- ...

  10. 上外网tunnel手段

    需要的软件 1, httptunnel软件,包括服务端和客户端,家里开启服务端,公司开启客户端 2,(可选)proxifier PE,用来在公司check 代理工作是否正常 3,动态域名服务,在家里用 ...