SQL:特殊情况下INNER JOIN和INNER SELECT之间的区别

时间:2014-04-11 09:04:12

标签: mysql sql oracle

我开始学习SQL。我发现在JOIN或Inner Select语句的帮助下,我们经常可以获得相同的结果。

问题1(广泛):哪里JOIN比内部选择快,反之亦然?

问题2(缩小):您能解释一下导致以下三个查询的性能差异的原因吗?

P.S。 very nice site计算查询效果,但我无法理解估算结果。

查询1:

SELECT DISTINCT maker 
FROM Product pro INNER JOIN Printer pri
on pro.model = pri.model

QUERY2:

SELECT DISTINCT maker
FROM Product 
WHERE model IN (
  SELECT model FROM Printer
)

QUERY3:

SELECT distinct maker 
FROM Product pro, Printer pri 
WHERE pro.model = pri.model

3 个答案:

答案 0 :(得分:2)

当服务器评估JOIN时,它只匹配连接等效性扫描只需要另一个表中的值所需的列,并过滤掉其他所有内容,通常通过特定操作完成。
当你有一个子查询时,服务器需要在JOIN等价匹配之前评估子查询的计划,所以如果子查询没有弥补过滤掉大量噪声的额外工作,那么没有它就会有更好的性能。

服务器非常聪明,他们试图削减他们不需要评估连接的所有内容。然后他们尝试使用他们能够获得最佳性能的每个索引,其中最佳性能意味着他们在有限的时间内找到的最佳性能,因此计划时间本身不会导致性能下降。

在OP的评论后添加
O(n)估计依赖于查询和子查询的复杂性,如果您对构建查询计划感兴趣,则必须浏览所选数据库的帮助部分,可能您不会发现很多,如果DB不是开源的。
通俗地说:

  • a简单连接在一个级别上评估,主要查询计划
  • 子查询在两个级别,子查询计划和主查询计划上进行评估。

某些DB IDE可以显示整个计划的可视化代表,这通常有助于理解其中的一些要点(我不知道mySQL是否具有这一点)

答案 1 :(得分:1)

Query1通常更快,但RDBMC可以优化Query2以提供大致相同的结果。

如果IN子查询与主表的依赖性相当复杂,则可以对检索到的每一行执行它以检查条件。

答案 2 :(得分:1)

通常INNER JOIN将连接两个不同的表值,其中INNER SELECT是从不同的表中选择特定值并使用结果生成单个输出。