条件用到了c1、c2、c3
c3没有对应的索引列
所以这个查询执行完成至少要全表遍历一边
所以不会使用c1、c2的索引的

解决方案 »

  1.   

    是这样吗?  那写一个sql查询条件里面的字段必须全都是索引列才能走索引?我觉得你这个不走索引肯定是oracle认为你这个查询走索引没有全表扫描快,分析考虑一下数据量方面吧。
      

  2.   

    为什么要走索引?
    cbo来根据统计信息采取最优的执行计划,在当前环境下,走索引可能会比不走索引的成本更高
    这里主要是因为c1和c2的选择性不高
    优化以前要先弄清楚,在这个查询中,c1,c2,c3哪个是主要的过滤条件,比例分别是多少
      

  3.   

    先把:
    select  count(*) from aa a;
     select  count(*) from aa a where a.c1='7' and a.c2 in ('1','2','3');
    的结果贴出来看看.10g的话大概超过5%就不会走索引了,当然oracle也要考虑其它因素,集群因子,二元高度,直方图等.不过也有一种情况是因为统计信息不准确造成的.
    你也可以试一下,
    select  /*+index(a 你的索引名)*/* from aa a where a.c1='7' and a.c2 in ('1','2','3') and a.c3='3'
    看看会不会比不加hint要快.
      

  4.   

    3楼正解。现在cbo都是自动择优的,走索引效率低,所以oracle选择不走索引