目录
第十三章 查询优化
13.1 概述
13.2 关系表达式的转换
13.2.1 等价规则
13.2.2 转换的例子
13.2.3 连接的次序
13.2.4 等价表达式的枚举
13.3 表达式结果集统计大小的估计
13.3.1 目录信息
13.3.2 选择运算结果大小的估计
13.3.3 连接结果与运算大小的估计
13.3.4 其他运算的结果集大小的估计
13.3.5 不同取值个数的估计
13.4 执行计划选择
13.4.1 基于代价的连接顺序选择
13.4.2 采用等价规则的基于代价的优化器
13.4.3 启发式优化
13.4.4 嵌套子查询的与优化
13.5 物化视图
13.5.1 视图维护
13.5.2 增量的视图维护
13.5.3 查询优化和物化视图
13.5.4 物化视图和索引选择
13.6 查询优化中的高级视图
13.6.1 top-K优化
13.6.2 连接极小化
13.6.3 更新的优化
13.6.4 多查询优化和共享式扫描
13.6.5 参数化查询优化
总结
查询优化(query optimization)就是从许多策略中找出能最有效的查询执行计划的一种处理过程。
查询优化器产生查询计划的步骤:
产生逻辑上与给定表达式等价的表达式对产生的表达式以不同的方式做注释估计每个执行计划的代价,选择估计代价最小的一个查看查询执行计划:
Oracle: 生成查询计划,并将计划存储在plan_table中: explain for <sql>;查询生成的查询计划:select * from table(dbms_xplan.display);postgreSQL: explain for <sql>等价的表达式(equivalent):如果两个关系表达式在每一个有效的数据库实例中都会产生相同的结果集。
等价规则(equivalence rule)指出了两种不同形式的表达式是等价的。
若一组等价规则中,任意一条规则都不能由其他规则联合起来导出,称这组等价规则集为最小的(minimal)等价规则集。
举例:等价规则的用法
一个好的连接次序 对于 减少临时结果的大小是很重要的。
例如:
可以用枚举的方式产生所有的等价表达式,如下图所示。这种方式在时间上和空间上的代价都很大。可以采用两种关键思想,优化器可以极大地减少时间和空间上的开销:
本节首先介绍一些有关存储在数据库目录中的有关数据库关系的统计信息;
然后指出如何利用这些统计信息估计不同关系操作运算结果的统计信息。
数据库目录存储了有关数据库关系的下列统计信息:
基于代价的优化器(cost-based optimizer)从给定查询等价的所有查询执行计划空间中进行搜索,选择估计代价最小的一个。
优化器可以采用的算法:
联系顺序选择算法:可以处理最常见的查询,并执行内连接操作。然而它无法解决如聚集、外连接、嵌套查询的操作。 基于代价的连接顺序选择算法:处理只有连接和选择的子表达式启发式转化的方法:处理连接以外的结构采用等价规则的基于代价的通用优化器(可以处理各种查询结构)
优点:采用等价规则可以使它易于扩展新的规则到优化器来处理不同的查询结构。例如:使用扩展的关系代数结构表达嵌套查询产生所以有的可能的执行计划的过程: 添加一类新的称为物理等价(physical equivalence rule )的等价规则,允许将例如连接这样的逻辑操作转为散列连接或嵌套循环连接这样的屋里操作。通过将这类规则加入到原来的等价规则(13.2.4节的算法)中,程序可以产生所有的可能的执行计划利用基于代价的估计技术选择最优计划如何使得上述算法更高效?基于代价优化的一个缺点是优化本身的代价。
启发式(heuristics)优化:利用一些规则来进行查询,例如:
尽早的执行选择运算尽早的执行投影原酸(通常选择运算优于投影运算执行比较好)注意:基于规则的启发式优化不一定总会带来高效的查询。
多数现实的查询优化器采取更多的启发式规则来减少优化的代价。例如:
System R优化器:仅考虑右操作对象是原始关系r1,r2,...,rn之一的那些连接顺序,这种连接顺序称为左深连接顺序(left-deep join order) 考虑全体左深连接顺序的时间代价是:O(n!)利用动态规划,可以实现在近似O(n2^n)找到最佳连接顺序某些版本的Oracle系统采用 一种 基于减少连接顺序选择代价的启发式优化算法。 对于一个n路连接,考虑n个评估计划每个计划使用一个左深连接顺序,各个计划从一个不同的关系开始进行通过基于可用的存取路径的排序反复选择参加下一个连接的“最佳”关系,启发式方法分为n个执行计划构造连接顺序。基于可用的存取路径,每一个连接可选择:嵌套循环链接算法、或排序归并连接算法。最后,基于是在内层关系上没有索引的嵌套循环连接个数最小,以及使得排序归并连接的个数最小的原则,用启发式方法从n个执行计划中选一个许多优化器允许为查询优化制定一个成本预算。
当超过优化成本预算(optimization cost budget)时停止搜索最优计划,返回当前找到的最优计划。可以动态设置这个成本预算优化器通常用低成本的一种启发式的规则找到以计划,然后在这个计划的基础上进行完整的基于代价的优化。
可以利用计划缓存(plan cashing)的方式缓存和重用查询计划。
复杂的嵌套子查询的优化非常困哪,许多优化器仅做少量的去除相关的工作。只要有可能,要尽量避免使用复杂嵌套子查询,因为不能保证优化器是否能将它们转换成一种能够有效运算的形式。
相关执行(correlated evaluation):
效率不高,对外层关系的每个元组都要进行单独的运算,导致大量的磁盘I/O。
例如:
普通的视图:数据库只存储定义该视图的查询语句
物化视图(materialized view):计算了内容并存储的视图。可以用来提高性能。
视图维护(view maintainance): 保持物化视图和原始数据同步更新的任务称作视图维护。可采取的方式包括:
采用人工书写代码的方式对视图定义中每个关系的插入、删除和更新定义触发器增量的视图维护(incremental view maintenance): 只对物化视图受影响的部分进行修改。不需要定义触发器,数据库系统会自动的进行增量的视图维护。 即时的视图维护(immediate view maintenance):更新发生时,增量的视图维护作为更新事务的一部分立即执行延迟的视图维护(deferred view maintenance):视图维护延迟到更晚一些执行,减少更新事务的开销。插入、删除、更新(可以先删除,再插入来实现)
13.5.2.1 选择和投影操作
13.5.2.2 选择和投影操作
13.5.2.3 聚集操作
13.5.2.4 其他操作
13.5.2.5 表达式的处理
物化视图的选择标准:选择的物化视图集应该能够是的系统完成查询和更新的工作负载所耗费的总执行时间(包括维护物化视图所用的时间)最短。
查询在某些属性排序后的结果中的前K项。
当K值很小时,如果一个查询优化计划先产生整个结果集,再排序产生K个结果,这种方法效率很低。
解决方法:
使用能够产生有序的结果的流水线查询计划估计将会出现在前K个输出中的排序属性的最大值,然后引入选择谓词删除较大的值