oracle 识别低效的执行计划
识别低效的执行计划
错误的估算
这个检查背后的思路很简单。查询优化器计算成本来决定哪些访问路径、联接顺序以及联接方法应该用于获取一个高效的执行计划。如果成本的计算有误,则很可能查询优化器会选择一个非最优的执行计划。换言之,错误的估算很容易导致选择错误的执行计划。
直接评价一个SQL语句本身的成本在实践中是不可行的。检查查询优化器执行的其他估算则相对容易得多,这种方式的成本估算基于由一个操作返回的行数(基数)。检查估算的基数十分容易,因为你可以使用dbms_xplan包的display_cursor函数,
比如说,可以直接使用真实的基数和估算的作对比。就像你刚刚看到的,只有当两个基数值接近时才表明查询优化器工作良好。这种方法的一个核心特性就是不需要SQL语句或数据库结构的相关信息来评价执行计划的优劣。你只需集中精力用实际的数据对比估算的信息。
让我通过一个例子来演示一下这个概念。下面这段来自wrong_estimations.sql脚本输出的摘录展示了一个带有估算(E-Rows)和实际基数(A-Rows)的执行计划。正如你所看到的,操作4的估算是完全错误的(因此还有操作2和操作3)。
查询优化器为操作4估算的是,只返回32行数据而不是80016行。更糟糕的是,操作2和操作3是关联组合操作。这意味着操作6和操作7,实际上被分别执行了80016和75808次,而不是估算的只执行32次。这是通过Starts列的值确定的。一定要注意操作6和操作7的估算是正确的。实际上,在作比较之前,实际的基数(A-Rows)必须除以执行的数量(Starts):
select count(t2.col2) FROM t1 JOIN t2 USING(id) WHERE t1.col1=666;