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

Nav*_*iam 1 sql oracle oracle10g

有人可以解释之间的差异INEXISTSNOT INNOT 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);
Run Code Online (Sandbox Code Playgroud)

如何将其转换为EXISTS?还有其他更好的方法吗?

gbn*_*gbn 8

优化器将处理INEXISTS相同(如果 IN子句不是常量列表)
那是因为它是"半连接"

同样,NOT INNOT EXISTS通常同等对待.这是一种"反半连接".例外情况是NOT IN子查询中有NULL.这会导致NOT IN始终为false

因此,性能方面没有区别,EXISTS/ NOT EXISTS将永远是正确的

请参阅" NOT IN与NOT EXISTS与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值而产生不同的结果.

在与JOIN与存在:甲骨文拥有了类似的结论