2017-07-30 52 views
1


我想返回一些基于子查询结果的结果,我想知道什么会更快 - 子查询结果是不同的或在子句中有重复?
'哪里'与重复或'选择不同' - 性能

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 
... 

这个例子可能没有意义,但它提出我的观点。

回答

3

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)采取指数的优势。

+1

如果我没有弄错,这两条语句完全一样。 Oracle将第一个重写为第二个(在这里http://sqlfiddle.com/#!4/4a9b0/2上的11.2g和第二个上的Oracle Live SQL上测试),计划哈希值是相同的 – LauDec

+0

@LauDec。 。 。我想这将取决于可用的索引。有些情况下你不想要相同的执行计划,而Oracle有一个非常聪明的优化器。 –