【问题标题】:Optimize query that takes too much time to be executed [closed]优化执行时间过长的查询[关闭]
【发布时间】: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 &lt;= EOMONTH(s.StartOfMonth) 之类的子句时,索引不会在这里为您提供帮助。

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多