Oracle中IN和EXIST之间的差异

时间:2015-01-17 04:36:06

标签: oracle oracle11g

IN Vs EXISTS:

第1点:

In:当子查询与外部查询相比包含的行数较少时生效

存在:当子查询与外部查询相比包含大量行时有效。子查询返回TRUE或FALSE。外部查询执行一次,外部查询子查询中的每个值都执行

但是在最近的Oracle版本中,优化器倾向于使用相同的执行计划(在Google中找到这一点)重写它们。 IN和EXIST(在我的电脑中观察)的执行计划是相同的

第2点:

我在谷歌搜索了NOT IN和NOT EXIST之间的差异。但大多数人都认为两者都是一样的。

我的问题:

问题1(第1点):我的假设是否正确?如果两者都被oracle以相同的方式处理,那么我们可以在查询中使用IN或EXIST吗?

问题2(第2点):有人可以解释为什么两者都相同吗?

2 个答案:

答案 0 :(得分:0)

现在可能很好地使用相同的优化路径,它们没有区别,

显然,除此之外 EXISTS接受子查询,IN支持子查询和表达式列表。

在某些情况下,您必须使用IN条件。

答案 1 :(得分:0)

除非Oracle在12C中改变了这两件事的含义,否则你不了解他们的所作所为。

IN函数获取运行查询的值列表。给出:

从foo中选择*,其中bar为(1,4,3);

评估结果为:

从foo中选择*,其中bar = 1或bar = 4或bar = 3;

EXIST功能允许您在通过子查询进行选择时获得显着的性能提升,例如:

从foo中选择*其中EXISTS(选择*来自xfoo,其中xbar = Z);

如果没有EXISTS,则必须完整评估整个子查询。

使用EXISTS,子查询只需要满足它找到的第一个元素。即:如果子查询产生10,000行,那么一旦系统找到1行,子查询返回true并满足主查询。