SQL Server查询优化器似乎做错了什么

时间:2014-03-14 13:38:21

标签: sql sql-server optimization

SELECT
    My.id,
    SUM (CountResults.Quantity) as TotalQuantity
FROM 
    (SELECT
        My.*, 
        ROW_NUMBER() OVER (ORDER BY My.Date DESC) AS RowNumber
     FROM [Test] My) My
OUTER APPLY
    (SELECT *
     FROM  ( /* really expensive query */ ) CR
     WHERE My.RowNumber = 1   
        /* I expect that optimizer will execute query only once for 1st row */
    ) CountResults
GROUP BY  
    My.id

我真正看到的是,查询需要花费更长的时间来执行,然后我会期望(我测量了单次执行内部查询的时间,它大约是0.1秒,而我的查询执行的时间要长得多)

我错过了什么吗?

PS:以.sqlplan格式https://www.dropbox.com/s/vn6oy69z5xbuuug/Plan%201.sqlplan进行规划 WHERE [My].[RowNumber] = 1与没有LEFT JOIN ( SELECT * FROM ( /* expensive query */ ) as [1] ) as CountResults ON My.RowNumber = 1 的查询。 正如你所看到的,它表示50%到50%,这很奇怪。

我也试过了:

{{1}}

没有任何改变。

1 个答案:

答案 0 :(得分:1)

如果外部应用子查询不相关 - 这似乎不相关 - 那么您不必使用OUTER APPLY。您可以使用简单的LEFT JOIN而不是GROUP BY重写,在不相关的子查询中移动聚合:

SELECT
    My.id,
    CountResults.TotalQuantity
FROM 
    (SELECT
        My.id, 
        ROW_NUMBER() OVER (ORDER BY My.Date DESC) AS RowNumber
     FROM [Test] My
    ) My
  LEFT JOIN
    (SELECT SUM(Quantity) AS TotalQuantity
     FROM  ( /* really expensive query */ ) CR
    ) CountResults
    ON  My.RowNumber = 1 ;