首页 > Oracle > oracle 优化 > oracle 索引扫描cost计算!
2013
10-19

oracle 索引扫描cost计算!

前文给大家介绍了标准的全表扫描cost计算,下面我们来看下一般的索引扫描cost是如何计算的,不过还是老话,cost对优化来说没有多大的用处,sql出现性能问题,cost看了也没撒用处了吧。

虽然对优化用处不大,但掌握以下算法还是有好处的,下面我们看下实验:

1. 创建test表,并创建idx_test索引

2. 对表和索引做收集一下统计信息,采样比例100%

3. 先看一下索引的信息

4. 再来看下test表的相关信息

5. 看如下sql的执行计划和cost

先引入一下索引扫描cost的计算公式:

cost =
blevel +
ceil(leaf_blocks *effective index selectivity) +
ceil(clustering_factor * effective table selectivity)

这里的sql过滤条件是object_id<1000,可以在执行计划中看出索引扫描的时候,预计返回972行,这个预估的基数是根据:选择性*(num_rows-num_nulls),我们先来看下选择性是如何得来的,因为这里的过滤字符是小于<,选择性= (limit-low_value)/(high_value-low_value)  =  (1000-2)/(93990-2),那预估的基数=(1000-2)/(93990-2)*91577

可以看到在有统计信息的情况下,返回的基数还是很准确的。

这样我们就可以算出oracle索引扫描的成本了:

1+ceil(203*(1000-2)/(93990-2))+ceil(2541*(1000-2)/(93990-2))

算出来的结果是31,和我们在执行计划中看到的cost是一样的。

前面是算全表扫描cost的时候,没有提到单位,但是可以从计算公式看,全表扫描没有单位,但这里索引扫描,大家从公式就可以看出来,成本就是块。

这里就不介绍更多的扫描方式怎么计算了,收工。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL