有人可以解释IN
与EXISTS
和NOT IN
之间的区别
和NOT EXISTS
。
因为我读过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
?
还有其他更好的方法吗?
答案 0 :(得分:8)
优化器会将IN
和EXISTS
视为相同(如果 IN子句不是常量列表)
那是因为它是一个“半连接”
同样,NOT IN
和NOT EXISTS
通常处理相同。这是一种“反半连接”。例外情况是NOT IN子查询中有NULL。这会导致NOT IN始终为假
因此,性能方面存在无差异,但EXISTS
/ NOT EXISTS
始终正确
请参阅“NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: Oracle”
Oracle的优化器能够看到NOT EXISTS,NOT IN和LEFT JOIN / IS NULL在语义上是等效的,只要列表值被声明为NOT NULL。
它对所有三种方法使用相同的执行计划,并且它们同时产生相同的结果。
在Oracle中,可以安全地使用上述三种方法中的任何方法从另一个表中缺少的表中选择值。
但是,如果值不能保证为NOT NULL,则应使用LEFT JOIN / IS NULL或NOT EXISTS而不是NOT IN,因为后者将产生不同的结果,具体取决于是否存在NULL值子查询结果集。
答案 1 :(得分:4)
答案 2 :(得分:1)
一些论坛&帖子说,“NOT IN& NOT EXIST使用相同的执行计划,并且他们同时产生相同的结果。”
但据我和我所说。我的行和行的经验几十张桌子, 原因是:
使用“NOT IN”时,查询执行嵌套的全表扫描, 而对于“NOT EXISTS”,查询可以使用子查询中的索引。
类似的原因是'IN'和& '存在' ...
谢谢你:D