Oracle10g 中 NOT IN 和 NOT EXISTS 哪个更快?
有人可以解释一下 IN
和 EXISTS
和 NOT IN
之间的区别吗
和不存在
。
因为我读到 EXISTS
会比 IN
工作得更好,而 NOT EXISTS
会比 NOT IN
工作得更好。
我创建的查询如下。
delete from tt_left t
where t.val = 0
and t.text in (select t1.text
from tt_left t1
where t.text = t1.text
and t.resulttext = t1.resulttext
and t.val = 0
and t1.val = 1);
如何将其转换为EXISTS
?
还有其他更好的方法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
优化器会将
IN
和EXISTS
视为相同(if IN 子句不是常量列表)那是因为它是“半连接”。
同样,
NOT IN
和NOT EXISTS
通常将被视为相同。这是一种“反半连接”。例外情况是 NOT IN 子查询中有 NULL。这会导致 NOT IN 始终为 false因此,性能方面没有差异,但
EXISTS
/NOT EXISTS
将始终正确请参阅“NOT IN 与 NOT EXISTS 与 LEFT JOIN / IS NULL:Oracle"
IN 与 JOIN 与 EXISTS:Oracle 也有类似的结论
The optimiser will treat
IN
andEXISTS
the same (if the IN clause is not a list of constants)That's because it is a "semi-join"
Likewise,
NOT IN
andNOT EXISTS
will be usually treated the same. This is an "anti-semi-join". The exception is where you have a NULL in the NOT IN subquery. This causes the NOT IN to always be falseSo, performance wise there is no difference but
EXISTS
/NOT EXISTS
will always be correctSee "NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: Oracle"
And IN vs. JOIN vs. EXISTS: Oracle which has a similar conclusion
检查 IN(对比) EXISTS 和 NOT IN(对比)NOT EXISTS。
Check IN (vs) EXISTS and NOT IN (vs) NOT EXISTS.
一些论坛和帖子说“NOT IN 和 NOT EXIST 使用相同的执行计划,并且它们在同一时间产生相同的结果。”
但根据我和我对行和鞋带的经验几十张桌子,
原因是:
当使用“NOT IN”时,查询执行嵌套全表扫描,
而对于“NOT EXISTS”,查询可以在子查询中使用索引。
类似的原因也适用于“IN”和“IN”。 “存在”...
谢谢:D
Some Forums & Posts say thats "NOT IN & NOT EXIST uses same execution plan, and they yield same results in same time."
But According to Me & my Experience with lacs of rows & dozens of tables,
And the REASON is:
When using “NOT IN”, the query performs nested full table scans,
whereas for “NOT EXISTS”, query can use an index within the sub-query.
Similar reason is for 'IN' & 'EXIST'...
Thankx :D