【发布时间】:2018-05-05 01:13:56
【问题描述】:
我还在学习阅读 SQL Server 中的执行计划。我想知道是否有人可以告诉我以下哪个查询更快。
左加入:
SELECT
[InvoiceNum] = CONVERT(VARCHAR(10),H.Date, 101) + ' #'
+ RTRIM(SUBSTRING(RptText, CHARINDEX('No.', RptText) + 3, 25))
FROM
dbo.RptDisplayHeader H
LEFT JOIN
dbo.RptDisplayDetail d ON d.RptID =H.RptID
AND d.ID =H.ID
AND d.Date =H.Date
AND d.Seq = 2
WHERE
H.ID = @ID
ANDH.RptID = @RptID
ORDER BY
H.Date DESC;
内联查询:
SELECT
[InvoiceNum] = CONVERT(VARCHAR(10),H.Date, 101)
+ (SELECT
' #' + RTRIM(SUBSTRING(RptText, CHARINDEX('No.', RptText) + 3, 25))
FROM
dbo.RptDisplayDetail d
WHERE
d.ID = @ID
AND d.RptID = @RptID
AND d.Seq = 2
AND d.Date =H.Date)
FROM
dbo.RptDisplayHeaderH
WHERE
H.ID = @ID
ANDH.RptID = @RptID
ORDER BY
H.Date DESC;
执行计划:
内联统计:
Table 'RptDisplayDetail'. Scan count 1723, logical reads 5444, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'RptDisplayHeader'. Scan count 1, logical reads 58, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
左连接统计:
Table 'RptDisplayDetail'. Scan count 1723, logical reads 5792, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'RptDisplayHeader'. Scan count 1, logical reads 58, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
【问题讨论】:
-
在没有假设的情况下,查询在逻辑上是不一样的。这是一个安全的假设吗?你看到这个假设了吗?
-
@SMor 为什么它们在逻辑上不一样?
标签: sql sql-server