您的位置:首页 > 其它

【性能优化案例】执行计划宁可走全表扫描,也不走索引

2013-07-24 16:22 501 查看
准备信息:

表:TABLE1,有一列为SEQ_ORD。

索引:在SEQ_ORD列上有一个NORMAL索引NONUNI_INDEX【nonunique】

问题:

测试语句:

SELECT SUM(SEQ_ORD) FROM TABLE1 WHERE SEQ_ORD>100;

第一次运行的时候,发现执行计划走的是全表扫描,并没有走索引。执行计划如下图:



[align=left] [/align]

于是,我在语句中添加了/*+INDEX(TABLE1 NONUNI_INDEX)*/的提示,让优化器能够走索引。执行计划如下图:



[align=left] [/align]

比较一下,这两个图,发现有三个特点:

1、走索引扫描的时候,所花费的成本明显比走全表扫描的要多;

2、走索引扫描的时候,单是索引的扫描成本只有181,不是很高,但是却在利用ROWID扫描表数据的时候,耗费了相当多的成本。

分析一下,可能是不是索引的问题。于是,查了一下这个索引的聚簇因子,发现果然很高。

select ind.index_name,ind.clustering_factor,tab.blocks,tab.num_rows from user_indexes ind,user_tables tab where ind.table_name = tab.table_name and tab.table_name = 'TABLE1' AND ind.index_name = 'NONUNI_INDEX';

于是,我重建了索引,在运行语句的时候,性能就有了很大的提高。执行计划,如下图:



[align=left] [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐