【发布时间】:2018-09-23 09:45:08
【问题描述】:
如果我创建一个子查询和一个仅包含整个查询所需的列的选择语句,表的联接是否更易于阅读或执行得更快?
-- Example
SELECT s.Id,
s.TransactionDate,
s.TransactionNo,
s.CustomerId,
s.SiteLocationId,
s.SubTotal,
sd.ItemId,
sd.UnitPrice,
sd.GrossAmount
FROM tblTransactions s
LEFT OUTER JOIN tblTransactionDetails sd ON sd.TransactionId = s.Id
对比一下:
SELECT s.Id,
s.TransactionDate,
s.TransactionNo,
s.CustomerId,
s.SubTotal,
sd.ItemId,
sd.UnitPrice,
sd.GrossAmount
FROM tblTransactions s
LEFT OUTER JOIN (
SELECT TransactionId,
ItemId,
UnitPrice,
GrossAmount
FROM tblTransactionDetails
) sd ON sd.TransactionId = s.Id
给出的每个示例的优点和缺点是什么?我也在尝试减少执行计划中详细信息的读取百分比。
【问题讨论】:
-
这只会使查询变得不必要的复杂。它既不更具可读性,也不应该以任何方式影响性能。请记住,在运行查询之前有一个优化器会分析您的查询。这个优化器将很容易检测到查询是等价的。坚持第一个直截了当的查询。
-
感谢您提供的信息。我只是假设,因为我不需要 Details 表的所有列,也许我可以通过只显示查询所需的具体列来减少查询的执行时间。
-
@ZeroCool - 优化器检测您在连接谓词中使用了哪些列、where 子句或您选择了哪些列,并据此仅“拉”那些列。
标签: sql-server subquery query-optimization jointable