Sql 当不需要来自第二个表的数据时,联接是否比中存在的效率更高/更低?

Sql 当不需要来自第二个表的数据时,联接是否比中存在的效率更高/更低?,sql,sql-server,join,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 Hou

我要查所有有订单的家庭。我根本不关心订单的数据,只关心它的存在。(使用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)

取决于数据库引擎以及它在优化查询方面的效率。一个好的成熟的数据库优化器将使存在更快,其他人则不会。我知道SQL Server可以使查询速度更快,但我对其他查询不太确定。

对于这种琐碎的查询,如果两种变体的执行都归结为一种形式就不足为奇了,这将被系统认为是性能最好的。请查看查询执行计划以了解情况。

这两个查询并不等效。如果有多个加入记录,第一个将返回多个结果。EXISTS可能会更有效,尤其是在没有可供优化人员使用的可信FK约束的情况下


有关最后一点的更多详细信息,请参见此处的第9点

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

在Oracle(和大多数DBMS)上,我希望Exists版本运行得更快,因为它只需要在订单中找到一行,家庭记录就符合要求

无论使用何种DBMS,我都希望explain计划能够显示差异(如果表非常大,查询将无法通过完整表扫描解决)

你试过测试吗?允许缓存吗


C.

在postgres中,exists将比INTERNAL join更快。

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

您可以通过使用
DISTINCT
来解决这个问题,但是
EXISTS
(或
IN
)更有效

见本文:


链接的文章是针对SQL Server的,这并不适用于所有数据库。正如我在回答中所说的,这取决于您的数据库,但是SQL Server将比join更好地优化现有数据库。您使用的是什么数据库(Oracle、SQL Server、MySQL、SQLite:-)?噢!已编辑问题以包含信息--SQL Server