【发布时间】:2021-03-13 08:33:48
【问题描述】:
我使用以下查询来计算每个月以及过去 12 个月的金额,并分别计算总和,但它太慢了。如何优化?
我创建了所有需要的索引,但它仍然很慢。
SELECT s.Activity, s.Sector, s.StartOfMonth, s.AmountMonth, SUM(salesLtd.Amount) [AmountLTD]
FROM (
SELECT Activity, Sector, SUM(Amount) [AmountMonth], StartOfMonth
FROM sales
CROSS APPLY (SELECT DATEADD(month, DATEDIFF(month, 0, dateSale), 0) [StartOfMonth]) [forStart]
GROUP BY Activity, Sector, StartOfMonth
) s
INNER JOIN sales salesLtd ON salesLtd.dateSale <= EOMONTH(s.StartOfMonth)
AND salesLtd.dateSale >= DATEADD(year, -1, s.StartOfMonth)
GROUP BY s.Activity, s.Sector, s.StartOfMonth, s.AmountMonth
【问题讨论】:
-
样本数据和期望结果会有所帮助。
-
与三角连接相比,窗口化的
SUM可能会快得多。当ON中有salesLtd.dateSale <= EOMONTH(s.StartOfMonth)之类的子句时,索引不会在这里为您提供帮助。
标签: sql sql-server tsql sql-server-2014