在Oracle10g中更快或者不是更快的东西?

时间:2011-12-28 11:56:41

标签: sql oracle oracle10g

有人可以解释INEXISTSNOT IN之间的区别 和NOT EXISTS。 因为我读过EXISTSIN效果更好,NOT EXISTSNOT 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? 还有其他更好的方法吗?

3 个答案:

答案 0 :(得分:8)

优化器会将INEXISTS视为相同(如果 IN子句不是常量列表)
那是因为它是一个“半连接”

同样,NOT INNOT 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值子查询结果集。

IN vs. JOIN vs. EXISTS: Oracle有类似的结论

答案 1 :(得分:4)

答案 2 :(得分:1)

一些论坛&帖子说,“NOT IN& NOT EXIST使用相同的执行计划,并且他们同时产生相同的结果。”

但据我和我所说。我的行和行的经验几十张桌子, 原因是:

使用“NOT IN”时,查询执行嵌套的全表扫描, 而对于“NOT EXISTS”,查询可以使用子查询中的索引。

类似的原因是'IN'和& '存在' ...

谢谢你:D