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内存有关
解决方案 »
- 不好意思,问题很棘手,盼望你的回答!!
- linux oracle 10g 安装问题
- Oracle中内连接和外连接如何同时使用?急!
- 如何将表中多行数据连接起来形成一个数据
- oracle10g 调度备份 定制备份 验证错误
- oracle备份文件的路径中不能含有中文字符的问题
- 请问sql语句文件打开路径名的格式应该是怎么样
- 在DBASTUDIO中备份与导出导入数据库中,所有过程都完成,结果却是提交失败!
- 启动数据库时报错 Error 57 initializing SQL*Plus Error loading message shared library
- 清除表数据
- oracle 数据库在机器重启后出现监听状态未知,请高手帮忙
- 一个sql运行错误
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的.