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 ...
随机推荐
- soft-nms
https://blog.csdn.net/app_12062011/article/details/77963494 ----> NMS-非极大值抑制进行后处理. 通常的做法是将检测框按得分排 ...
- HPU组队赛L(没有标题。。)(贪心)
时间限制 1 Second 内存限制 512 Mb 题目描述 给个字符串s和整数k.(字符串中只有0-9) 问至少修改字符串中的几位才可以让字符串的各个位之和大于等于k. 输入 第一行一个整数T表 ...
- QuickSort(Java)
private void quickSort(int[] input, int start, int end) { if (start >= end) return; int index = p ...
- web四则混合运算3
一.程序要求: 可以控制下列参数: 是否有乘除法: 是否有括号(最多可以支持十个数参与计算): 数值范围: 加减有无负数: 除法有无余数! 二.设计思路 要求能够通过参数来控制有无乘除法,加减有无 ...
- 01 mysql
Sql语句: Structured Query Language, 结构化查询语言 分类: DDL (数据定义语句) 数据定义语言 - Data Definition Language 用来定义数据库 ...
- 20165313 《Java程序设计》第二周学习总结
教材学习总结 这周我主要学习了教材上的二,三两章.其基本内容就是数据与语句的表达与基本的运用.其中重点要理解并掌握的是: 1.Scanner的运用:利用该类创建对象就可以完成要求用户输入这一要求.类似 ...
- 【NOI2014】【BZOJ3669】【UOJ#3】魔法森林
我学会lct辣 原题: 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为 1…n1…n,边标号为1…m1…m.初始时小E ...
- 2013级计算机学院数字媒体专业李成梁(笛卡尔积,概率树状图)& 学生选课
初中数学问这个向量 ( * , 计算学院 , * , * ) 任取一个向量来自计算机的概率 4*1*100*10000/ 8千万 限定在计科院数字媒体技术专业大二上期选课这个小的范围 学生 ...
- 依赖注入的方式测试ArrayList和LinkedList的效率(对依赖注入的再次理解)
9/20 号再进行学习 在C++中,main函数尽可能的简单,只要调用子函数的一句话就实现了功能. java开发中,controller就相同于是main函数,其他类的方法不在本类中时候, 1.可以用 ...
- linux日志管理
//有关当前登录用户的信息记录在文件utmp中 //登录进入和退出纪录在文件wtmp中 [root@bogon python]# who //who命令查询utmp文件并报告当前登录的每个用户 /va ...