【问题标题】:SQL Server Using sub query in JOIN statementsSQL Server 在 JOIN 语句中使用子查询
【发布时间】: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


【解决方案1】:

我认为 SQL Server 为这两个查询创建了相同的执行计划。如果你想通过列选择来提高性能,你应该创建一个非聚集索引。然后,查询优化器应该使用更紧凑的索引而不是表。

CREATE NONCLUSTERED INDEX ix_tblTransactionDetails_test 
    ON tblTransactionDetails (TransactionId) INCLUDE (ItemId, UnitPrice, GrossAmount)

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2018-09-13
    • 2017-03-10
    相关资源
    最近更新 更多