参考:
http://valen.blog.ccidnet.com/blog-htm-do-showone-uid-51502-type-blog-itemid-207620.html
读书心得《基于成本的Oracle优化法则》4章 索引访问路径的流程:
1. 为索引列准备谓词
2. 定位索引root block
3. 沿着 branch level 到leaf block,寻找start key
4. 遍历leaf list,获得和谓词匹配的stop key
5. 决定是否根据rowid访问table block
索引访问的成本公式:
Cost =
Blevel + (解释:索引高度)
Ceiling(leaf_blocks * effective index selectivity) +(解释:叶块×索引选择率)
Ceiling(clustering_factor * effective table selectivity) (解释:集群因素×表选择率)
有效索引选择率:
Selectivity(P and Q) = selectivity(P) * selectivity(Q)
有效表选择率
如果优化器觉得所有谓词都是基于索引的扫描,那么表扫描率就=索引扫描率
集群因素 CLUSTER_FACTOR
一个TABLE的CLUSTER_FACTOR越好,那么它越接近块数,反之则接近行数。我现在就知道 (clustering_factor * effective table selectivity)的含义了,因为优化器每次访问一个不同的块时,都需要一个新的I/O。重建索引可以减少leaf block,但是它对cluster factor无效。
根据索引COST计算公式:
cost = (cost(INDEX RANGE SCAN)+cost(TABLE ACCESS BY INDEX ROWID)) * optimizer_index_cost_adj%
cost = blevel +ceiling(leaf_blocks * effective index selectivity) + -- cost(INDEX RANGE SCAN)
ceiling(clustering_factor * effective table selectivity) --cost(TABLE ACCESS BY INDEX ROWID)
select LEAF_BLOCKS,distinct_keys,clustering_factor,num_rows from dba_IND_STATISTICS WHERE table_name=xxxxxx' and index_name='IND_xxx';
select 2+ceil(220102*0.0191515683)+ceil(61714021*0.0191515683) from dual;
1186139