select * from tableA a
where exists (select * from tableB b where a.id = b.id);这句查询速度很慢,一晚上都跑不下来tableA和tableB数据量都是200万左右,表结构完全一样
2表的id字段都建了索引,单个查询速度没问题无奈之下只能写存储过程用cursor来处理,那样半小时就跑完了。请问这种现象可能是和原因,是否和oracle内存有关
where exists (select * from tableB b where a.id = b.id);这句查询速度很慢,一晚上都跑不下来tableA和tableB数据量都是200万左右,表结构完全一样
2表的id字段都建了索引,单个查询速度没问题无奈之下只能写存储过程用cursor来处理,那样半小时就跑完了。请问这种现象可能是和原因,是否和oracle内存有关
select A.*
from tableA a ,tableB b
where a.id=b.id
不就行了嘛
否则可能查询出重复记录
select * from tableA a
where exists (select 1 from tableB b where a.id = b.id);
看看执行计划,和sql trace
这个效率没有 no exists效率高!
select * from table a,b where a.id=b.id不可以吗?
两个表数据量都很大,而且数据量差不多的情况的下,建议用exists效率高些。
FROM TABLEA A
WHERE EXISTS (SELECT 1
FROM TABLEB B
WHERE A.ID = B.ID
AND ROWNUM <= 1);
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要好!
where a.id in (select distinct b.id from tableB);
效果应该一样吧,但不知道效率怎么样
可以用两个表的连接来实现同样的功能,在id字段上有索引的话,是不会全表扫描A,B的.