当第二个表中不需要数据时,JOIN的效率是否比EXISTS IN更高/更低?

时间:2010-03-22 12:01:31

标签: sql sql-server join

我需要查看所有订单的家庭。我根本不关心订单的数据,只是它存在。 (使用SQL Server)

说这样的话更有效率:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
INNER JOIN Orders ON Orders.HouseholdID = Households.HouseholdID

或者这个:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
WHERE EXISTS 
    (SELECT HouseholdID 
     FROM Orders 
     WHERE Orders.HouseholdID = Households.HouseholdID)

6 个答案:

答案 0 :(得分:4)

除非这是一个相当严格的1:1关系(考虑到家庭和订单的更广泛含义,似乎没有多大意义),您的查询将返回不同的结果(如果订单中有更多匹配的行表)。

在Oracle(以及大多数DBMS)上,我希望Exists版本的运行速度要快得多,因为它只需要在“家庭”记录的订单中找到一行即可获得资格。

无论DBMS如何,我都希望解释计划能够显示差异(如果表格非常大,则无法通过全表扫描解析查询)。

您是否尝试过测试?允许缓存?

下进行。

答案 1 :(得分:3)

2个查询不等效。如果有多个连接记录,第一个将返回多个结果。 EXISTS可能会更有效,尤其是如果没有可信赖的FK约束,优化器可以使用。

有关最后一点的详细信息,请参阅此处的第9点http://www.simple-talk.com/sql/t-sql-programming/13-things-you-should-know-about-statistics-and-the-query-optimizer/

答案 2 :(得分:2)

取决于数据库引擎以及优化查询的效率。一个好的成熟数据库优化器会使EXISTS更快,而其他人则不会。我知道SQL Server可以使查询更快,我不确定其他人。

答案 3 :(得分:1)

如前所述,如果至少有一个房子有多个订单,您的查询将返回不同的结果集。

您可以使用DISTINCT解决此问题,但EXISTS(或IN)效率更高。

参见这篇文章:

答案 4 :(得分:0)

对于这样简单的查询,如果两个变体的执行将归结为单个形式,这将是毫不奇怪的,这将被认为是系统中性能最高的形式。查看查询执行计划以查找。

答案 5 :(得分:0)

在postgres中,exists会比内连接更快。