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

准备信息:

表:TABLE1,有一列为SEQ_ORD。

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

 

问题:

测试语句:

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

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

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

 

 

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

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

 

 

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

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';

 

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

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

 

 

你可能感兴趣的:(Performance,Tuning)