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

连接排序

查询计划的执行主要取决于表的连接顺序。例如,当分别连接大小为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. Java设计模式(一)

    1.什么是设计模式? 在软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的 解决方案. 换句话说,设计模式是一套被反复使用.多数人知晓的.经过分类的.代码设计的 经验的总结.使用设计模式是 ...

  2. com.sun.org.apache.xerces.internal.impl.dv.util.Base64出现的问题

    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 出现的问题是这个在eclipse中无法使用,解决方法如下: (1)进入ec ...

  3. 20155208徐子涵 2016-2017-2 《Java程序设计》第2周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 第三章 基础语法 3.1 类型.变量与运算符 • 关键字:在定义java文件名的时候要 ...

  4. 【二分图最大权完美匹配】【KM算法】【转】

    [文章详解出处]https://www.cnblogs.com/wenruo/p/5264235.html KM算法是用来求二分图最大权完美匹配的.[也就算之前的匈牙利算法求二分最大匹配的变种??] ...

  5. jsp中<%两个最容易搞混淆的用法,附:out.println与out.write的用法

    jsp中的<% java代码 %>,表示的是在html中写入java代码,其写入的格式就是在java代码的两头加上<% %>.搞明白这些以后,我们再来看看在js中,最易搞混淆的 ...

  6. MySQL--批量插入导致自增跳号问题

    对于批量插入数据的操作,MySQL申请自增的策略为: 在批量插入语句执行过程中,申请策略: .第一次申请自增值时,会分配1个 .在N次申请自增值时,会分配上一次(第N-1次)的2倍. 测试Demo: ...

  7. 使用patroni 构建高可用的pg 数据库

    patroni 是一个基于zk.etcd .consul 等的pg ha 模版,我们可以使用这个工具,快速的搭建一套 pg 的高可用方案 环境准备 mac 操作系统 安装基础差组件 brew inst ...

  8. cocos2d-x游戏开发 跑酷(三) 人物跑动

    原创.转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21245881 好吧.最终要跑起来了. 要实现跑酷须要用到帧动画,什么是帧动画,不 ...

  9. jsp与servlet的区别与联系

    jsp和servlet的区别和联系:1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能 ...

  10. node api 之:Error

    Node.js 中运行的应用程序一般会遇到以下四类错误: 标准的 JavaScript 错误: <EvalError> : 当调用 eval() 失败时抛出. <SyntaxErro ...