语句一:select * from tab where 条件一
语句二:与语句一完全相同,只是增加了一个 in(1,2,5...20)子句为什么语句二比语句一要花几倍的时间呢?

解决方案 »

  1.   

    因为执行计划改变了把in改成exists例如:select a.* from table_a a where a.name exists(select b.name from table_b b where b.id=a.id);
      

  2.   

    感谢楼上两位的回答,不过我的问题并不是用exists代替in,而是相同语句增加一个in条件后速度变慢现在问题已经解决,是因为索引造成的,屏蔽索引后使用in的这一句甚至更快了
      

  3.   

    exists 与In在Sql语句里面是同一效果,没有什么差别,2者之间可以等价,
      

  4.   

    仔细查看了一下执行计划,问题清楚了,原sql类似如下
    select * from tab where d_date>=:arg1 and d_date<=:arg2 and typeid in( 1,3..20 )
    该表分别对d_date和typeid列建了两个索引当使用select * from tab where d_date>=:arg1 and d_date<=:arg2 语句时 ,oracle选择了d_date索引,结果该索引使数据搜索范围大大降低当增加in语句后,d_date索引未被使用,而使用了typeid作为索引,结果该索引的意义不大,导致性能下降,看来索引确实不能乱建
      

  5.   

    最终把sql语句改成了
    select * from tab where d_date>=:arg1 and d_date<=:arg2 and typeid+0 in( 1,3..20 )