内部联接与内部联接(SELECT。FROM)

这两个版本的查询在性能方面是否有区别?

--Version 1 SELECT p.Name, s.OrderQty FROM Product p INNER JOIN SalesOrderDetail s on p.ProductID = s.ProductID --Version 2 SELECT p.Name, s.OrderQty FROM Product p INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s on p.ProductID = s.ProductID 

我听说(由DBA)说,版本2更快,因为它在内部SELECT语句中仅提取查询所需的列。 但这似乎没有道理,因为查询性能(据我所知)是基于受影响的行数和返回列的最终列表。

查询计划是相同的,所以我猜这两者之间没有任何区别。

我对么?

你是对的。 你做了正确的事情,检查查询计划,而不是试图猜测优化器。 🙂

不会有太大的区别。 当你有一些计算,聚合等应该join到它之外的时候,版本2是多么的简单

 --Version 2 SELECT p.Name, s.OrderQty FROM Product p INNER JOIN (SELECT ProductID, SUM(OrderQty) as OrderQty FROM SalesOrderDetail GROUP BY ProductID HAVING SUM(OrderQty) >1000) s on p.ProductID = s.ProdctId 

似乎是相同的,以防SQL服务器不会尝试读取查询所不需要的数据,优化器足够聪明

join复杂的查询(即有连接,分组等等)的时候,它是有意义的,那么,指定必要的字段是更好的select。

但还有一点。 如果查询很简单,没有什么区别,但是每个额外的操作,即使是提高性能,都会使优化器工作更加困难,优化器可能无法及时获得最佳计划,并且运行不是最佳查询。 所以演员select可以是一个这样的行为,甚至可以降低性能

你通过查询计划来做正确的事情。 但是我对版本2有100%的信心。当logging数量非常高的时候速度会更快。

我的数据库有大约1,000,000条logging,这正是查询计划显示两个查询之间的差异的场景。 而且,如果您在连接本身中使用它,而不是使用where子句,则会使查询更快:
SELECT p.Name,s.OrderQty
FROM Product p
INNER JOIN(SELECT ProductID,OrderQty FROM SalesOrderDetail)s on p.ProductID = s.ProductID WHERE p.isactive = 1

这个查询的更好的版本是:

SELECT p.Name,s.OrderQty
FROM Product p
INNER JOIN(SELECT ProductID,OrderQty FROM SalesOrderDetail)s on p.ProductID = s.ProductID AND p.isactive = 1

(假设isactive是产品表中代表活动/非活动产品的字段)。