单表,数据量比较大,有一个查询用到name in('aa','bb','cc'),据说用exits会提高,不知道单表exits该怎么写,会提高速度吗?name 上有索引 

解决方案 »

  1.   

    单表不用exists,exists和in的效率也取决于两个表的大小关系,单表也不存在效率问题,建立适合的索引
      

  2.   

    你in里就三个值,用in就可以了,in里面如果有很多值的话可以考虑exists
      

  3.   

    in和exist的主要区别体现在对sql执行计划的影响上。主要是影响多表关联查询。
    in是对外表和内表做hash join; exist是对外表做loop,每次loop值再对内表做查询。
    另外需要特别注意的是,in和exist的区别只在10.2.0.3及以前的版本中存在;而10.2.0.4及以后的版本中,in和exist的效果是完全一样的,手册中也删除了有关二者区别的说明
      

  4.   

    name 上有索引。单表用in就行
      

  5.   

    exist是兩個表以上進行聯的!一個人還是用in比較好阿!
      

  6.   

    你这3个值都是定死了,用不着子查询了,干嘛还要用Exists
    有两例子,以说明 “exists”和“in”的效率问题
    1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
        T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
    2) select * from T1 where T1.a in (select T2.a from T2) ;
         T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
      

  7.   

    很支持7楼,in和exist的效率的高低取决于循环的表的大小。
      

  8.   


    这个不一定吧?如果基于规则,in会相当于or,即会对in里面的每个值内容采用索引形式查询,如果基于成本,会先分析情况,有可能采用or扩展,hash join,转换成exist等等
    in和exist的效果在很复杂的sql中还是会出现不一样的效果的,因为有些时候sql转换很难或者强制了使用某些索引
      

  9.   

    这个也不绝对,特别是在分页查询中,假如T1是一亿数据,T2是十万数据,而T2的数据中只有一百条能与T1关联,但T1中只有及个别数据不能关联T2,这样的查询显然1会高于2.而且2的查询数据会很慢。
      

  10.   


    这个不一定吧?如果基于规则,in会相当于or,即会对in里面的每个值内容采用索引形式查询,如果基于成本,会先分析情况,有可能采用or扩展,hash join,转换成exist等等
    in和exist的效果在很复杂的sql中还是会出现不一样的效果的,因为有些时候sql转换很难或者强制了使用某些索引
    in和exist很多时候还要考虑到表数据之间的关联性,如果跳出了具体数据,但只说in和exist的差别,某些时候会经常判断不对
      

  11.   

    exist不一定就快,数据量比较小的时候,反而in更合适