【问题标题】:Left Join vs line query with execution plan带有执行计划的左连接与行查询
【发布时间】: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


【解决方案1】:

你需要比较最左边的select语句的估计子树成本(这是最后执行的操作)

成本最低的是(理论上)您最快的查询。

更可靠的衡量标准是您发布的 IO 统计信息。

根据您发布的统计信息,内联查询稍微好一点,因为对 RptDisplayDetail 表的逻辑读取较少。但是,就我个人而言,我会取消这种边际收益,以支持其他查询的可读性(除非您特别遇到性能问题)

a great video over at BrentOzar.com 在那里他调整了 StackOverflow 数据库上的示例查询

【讨论】:

  • 谢谢,我在我的问题中添加了统计信息 :) LEFT JOIN 有更多的逻辑读取。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多