我需要查看所有订单的家庭。我根本不关心订单的数据,只是它存在。 (使用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)
答案 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会比内连接更快。