select * from tableA a
where exists (select * from tableB b where a.id = b.id);这句查询速度很慢,一晚上都跑不下来tableA和tableB数据量都是200万左右,表结构完全一样
2表的id字段都建了索引,单个查询速度没问题无奈之下只能写存储过程用cursor来处理,那样半小时就跑完了。请问这种现象可能是和原因,是否和oracle内存有关

解决方案 »

  1.   

    你直接
    select A.*
    from tableA a ,tableB b
    where a.id=b.id
    不就行了嘛
      

  2.   

    直接这样查适用于id是A表和B表的主键的情况
    否则可能查询出重复记录
      

  3.   


    select * from tableA a 
    where exists (select 1 from tableB b where a.id = b.id); 
      

  4.   


    看看执行计划,和sql trace
      

  5.   


    这个效率没有 no exists效率高!
      

  6.   

    这里不用exists吧,你直接用:
    select * from table a,b where a.id=b.id不可以吗?
      

  7.   


    两个表数据量都很大,而且数据量差不多的情况的下,建议用exists效率高些。
      

  8.   

    楼主能否把 × 都换成列名让一列去 No Exists  虽说200W数据不多但是每一列都去遍例  应该很费时间   改一下试试吧
      

  9.   

    感觉这个比你的能快点吧。SELECT A.*
      FROM TABLEA A
     WHERE EXISTS (SELECT 1
              FROM TABLEB B
             WHERE A.ID = B.ID
               AND ROWNUM <= 1);
      

  10.   

    EXISTS的执行流程 
     select * from t1 where exists ( select null from t2 where y = x )
    可以理解为: for x in ( select * from t1 ) loop if ( exists ( select null from t2 where y = x.x ) then   OUTPUT THE RECORD  end if  end loop
    在未对表进行分析前,若两个表数据量差异很大,则外层表是大表时使用IN较快, 外层表是小表时使用EXISTS较快
    通常来说 , 采用表连接的方式比EXISTS更有效率
    SELECT ENAME FROM EMP E WHERE EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A’);
    更高效SELECT ENAME FROM DEPT D,EMP E WHERE E.DEPT_NO = D.DEPT_NO AND DEPT_CAT = ‘A’ ;此处是典型的滥用exists!外层表A表200万数据,使用exists明显性能很差,另外你这里没有其他主键过滤条件
    虽然可修改为:
    select A.* 
    from table A a ,tableB b 
    where a.id=b.id
    但仍然是会全表扫描A,B表
    但无论如何,都会比使用exists要好!
      

  11.   

    select * from tableA a 
    where a.id in (select distinct b.id from tableB); 
    效果应该一样吧,但不知道效率怎么样
      

  12.   

    搂主可以看下您的这句话的执行计划,应该对A 表进行全表扫描.所以效率底下.
    可以用两个表的连接来实现同样的功能,在id字段上有索引的话,是不会全表扫描A,B的.