oracle10g,偶然发现,在where中对同一字段限制两遍后开销更低,执行更快,比如有一个查询
where in_date>=sysdate-300,
cost要1000多,如果用两个
where in_date>=sysdate-300
and in_date>=sysdate-310
这样cost只有几百,查询花的时间也比上面少,这是啥道理啊(ps,这个字段有加入索引)

解决方案 »

  1.   

    只有一条in_date>=sysdate-300时,不走索引,全表扫描,多加一条and in_date>=sysdate-310后走索引了
      

  2.   

    只写 in_date>=sysdate-310,看看什么执行计划。
      

  3.   

    看一下in_date>=sysdate-300和in_date>=sysdate-310的记录数分别占总记录的百分比是多少?
      

  4.   

    and交集后 in_date>=sysdate-300
    and in_date>=sysdate-310  就是  in_date>=sysdate-310,不走索引 可能是 in_date>=sysdate-300的量 大于总量的20%还是25(记不清了)。
      

  5.   

    同意楼上,占比超过一定量的时候,ORACLE会选择全表扫描,因为效率更高
      

  6.   

    是单独in_date>=sysdate-300,不走索引,and两个条件后才走索引
    而已and交集后应该还是in_date>=sysdate-300吧,和原来一个条件是实际过滤是一样的
      

  7.   

    占比差不多,不光是300,换成sysdate-400与sysdate-600,400时不走索引,加上-600时两个条件就走索引