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}}
没有任何改变。
答案 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 ;