Sql 当不需要来自第二个表的数据时,联接是否比中存在的效率更高/更低?
我要查所有有订单的家庭。我根本不关心订单的数据,只关心它的存在。(使用SQL Server) 这样说是否更有效: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
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
)更有效
见本文: