Sql 优化执行时间过长的查询

Sql 优化执行时间过长的查询,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我使用以下查询来计算每个月以及后续12个月的金额,并单独计算金额,但速度太慢。我如何优化它 我创建了所有需要的索引,但仍然很慢 SELECT s.Activity, s.Sector, s.StartOfMonth, s.AmountMonth, SUM(salesLtd.Amount) [AmountLTD] FROM ( SELECT Activity, Sector, SUM(Amount) [AmountMonth], StartOfMonth FROM sales

我使用以下查询来计算每个月以及后续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

假设。您有每个月的值,然后只需使用窗口函数:

SELECT Activity, Sector, SUM(Amount) [AmountMonth], StartOfMonth,
       SUM(SUM(Amount)) OVER (PARTITION BY Activity, Sector ORDER BY MIN(dateSale) ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) as amount_12monhth
FROM sales CROSS APPLY 
     (VALUES (DATEFROMPARTS(YEAR(dateSale), MONTH(dateSale), 1)
     ) v([StartOfMonth])
GROUP BY Activity, Sector, StartOfMonth

样本数据和结果会有所帮助。与三角形连接相比,加窗求和可能要快得多。当您有salesLtd.dateSale这样的子句时,索引不会在这里帮助您