同一查询的这两个版本在性能方面是否存在差异?
--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语句中仅获取查询所需的列。但这似乎没有意义,因为查询性能(据我所知)是基于受影响的行数和返回的最终列列。
两者的查询计划是相同的,所以我猜这两者之间没有任何区别。
我说错了吗?
答案 0 :(得分:34)
你是对的。你做了正确的事情,检查查询计划,而不是试图猜测优化器。 : - )
答案 1 :(得分:9)
没有太大区别。如果你有一些应该在它之外加入的计算,聚合等,那么版本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
答案 2 :(得分:0)
似乎是相同的,以防SQL服务器不会尝试读取查询不需要的数据,优化器足够聪明
加入复杂查询时会有意义(即具有联接,分组等本身)然后,是的,最好指定必填字段。
但还有一点。 如果查询很简单,那么没有区别,但是即使是应该提高性能的每个额外操作都会使优化器更加困难,优化器无法及时获得最佳计划并且运行不是最佳查询。因此,额外选择可以是一种甚至可以降低性能的行为
答案 3 :(得分:-3)
通过查询查询计划,您做了正确的事情。但是我对版本2有100%的信心。当关闭记录的数量偏高时,速度会更快。
我的数据库有大约1,000,000条记录,这正是查询计划显示两个查询之间差异的情况。
此外,如果您在连接本身中使用它,而不是使用where子句,它会使查询更快:
SELECT p.Name,s.OrderQty
来自产品p
内部联接(SELECT ProductID,OrderQty FROM SalesOrderDetail)s on p.ProductID = s.ProductID
在哪里p.isactive = 1
此查询的更好版本是:
SELECT p.Name,s.OrderQty
来自产品p
INNER JOIN(SELECT ProductID,OrderQty FROM SalesOrderDetail)s on p.ProductID = s.ProductID AND p.isactive = 1
(假设isactive是产品表中的一个字段,表示活动/非活动产品)。