'哪里'与重复或'选择不同' - 性能
问题描述:
我想返回一些基于子查询结果的结果,我想知道什么会更快 - 子查询结果是不同的或在子句中有重复?
例'哪里'与重复或'选择不同' - 性能
select *
from some_table
where my_column in (select /* distinct? */ my_column from some_table_2)
如果
-- subquery
select /*distinct?*/ my_column from some_table_2;
这将返回类似:
| MY_COLUMN
1 | 25
2 | 25
3 | 54
...
这个例子可能没有意义,但它提出我的观点。
答
将distinct
放入子查询in
没有任何好处。 in
做所谓的“半连接”。这停在第一个匹配的行。可能会忽略select distinct
。其他数据库可能会实际执行它。
如果你关心性能,请尝试这两个版本:
select t.*
from some_table t
where my_column in (select my_column from some_table_2)
和
select t.*
from some_table t
where exists (select 1 from some_table_2 t2 where t2.my_column = t.my_column);
此版本可以在some_table_2(my_column)
采取指数的优势。
如果我没有弄错,这两条语句完全一样。 Oracle将第一个重写为第二个(在这里http://sqlfiddle.com/#!4/4a9b0/2上的11.2g和第二个上的Oracle Live SQL上测试),计划哈希值是相同的 – LauDec
@LauDec。 。 。我想这将取决于可用的索引。有些情况下你不想要相同的执行计划,而Oracle有一个非常聪明的优化器。 –