要对比两张表TA和TB:
select *
from TA a
where not exists
(select v_key from TB b where a.v_key = b.v_key);
select *
from TA, (select v_key from TB) c
where TA.v_key = c.v_key(+)
and c.v_key is null;
如果表TA和TB都有大量数据的话,哪个效率会比较高一点?
第一个效率高。
首先,使用 EXIST,Oracle 系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。
其次,任何 SQL语句,只要在 where子句中使用了 is null或 is not null,那么 Oracle优化器就不允。
我怎么觉着第二句有问题。。。
第一个 :o
[quote]select *
from TA a
where not exists
(select v_key from TB b where a.v_key = b.v_key); [/quote]
这句会好多了
:lol: 忘了写了 要写1!
exists 有找到匹配的就结束的,一般不会全表扫描的,
如果你是用pl/sql工具,你可以按下F5,看下执行计划,看看是怎样解析SQL语句的,你也可以贴出来,让大家帮你分析
select * 的效率低,建议将列名写上,另外from后的表名起别名用别名查询也会提高效率。
[quote]其次,任何 SQL语句,只要在 where子句中使用了 is null或 is not null,那么 Oracle优化器就不允许使用索引了。[/quote]