日期:2014-05-16  浏览次数:20469 次

oracle索引不执行问题小结
这两天碰到一个问题,在一个分区表建立了索引,用sql分别在测试机数据库和生产机数据库执行,发现在测试机上面可以走索引,但是在生产机上面不走索引,咨询了一下以前的dba同事,给出了下面一些建议:

1.执行这条sql
select /*+ index(TRACE_BASE_INFO TRACE_BASE_INFO_CDX_2)*/ T.SERVER_NAME , SERVER_TIME , REFER_TYPE
     from TRACE_BASE_INFO T
    where SERVER_NAME = 'test.39.net'
      and SERVER_TIME > '2011-03-10'
      and REFER_TYPE > 0

需要注意如果表有别名,提示也得用别名

2.测试机上的的数据量,跟生产机的数量有差别么?另外结果的数据占全表的数据百分几呢?对ORACLE来说,如果结果集占了大部分表的数据,它评估后会认为全表扫描的成本比走索引要低,所以它不走索引。

的确 我的测试机数据是1百多万,生产机数据才有7万多,很有可能问题就出现在这里。但是还有一点我想不明白的就是我查询出来的结果是500条这个也不会占大部分表数据,不知道oracle为什么还是不走索引,很奇怪。得再多观察几次。


3.如果表是按时间分区的,那么你的索引就不需要SERVER_TIME列了,建这么多列的组合索引,需要考滤是否有必要?

这里可能我得再重新优化下索引