之前看过一段文章说in会导致全表扫描,我现在想要一个用not in的语句 我想请问下 怎么样才能避免全表扫描 另外下面的情况下 哪些会导致全表扫描a!=0 and a!=1 
a not in ('0','1')

解决方案 »

  1.   

    可以用Exist代替in ,用 not exist 代替 not in 
    例如:
    低效:
    SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT 
    WHERE LOC = ‘MELB’)
    高效:
    SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND 
    EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
      

  2.   

    可以负责任的告诉你 说in会走全表扫描的文章是误人子弟
    如果oracle认为全表扫描更快 会全表扫描 但是一般来说 in还是会走索引的
    还有,in和exist not in和not exist哪个效率更高 一直没有定论
    如果in中的数据量很大,exist效率可能会高于in 要分情况
    但是决不能简单的认为 exist效率比in高
    否则 oracle早把in淘汰了
      

  3.   

    1.in 其实是可以走索引的
    2.in和exists是分情况使用的
     a)外表大,内表小时用in,因为in会对内表做全表扫描。
     b)外表小,内表大时用exists,因为内表找到了满足条件的记录就退出了。
      

  4.   

    走不走全表扫描,全看当前表数据的存储方式和查询谓语,说in不走索引,太武断了,这可能是对于早期版本的Oracle数据库来讲的。