我在SQL Server 2012中的查询遇到一些性能问题。
该查询用于使用窗口函数将数据插入表中,以不同的方式(上个月,上个月,至今的周期,年初至今,MAT)汇总销售数据。
在对Windows函数进行了相当广泛的研究之后,我认为从中读取数据的表中的适当索引会有所帮助,但我一直在努力寻找正确的索引(涉及的列过多)...
从中读取数据的源表大约有5000万行,并且每天都会被SSIS包截断并重新加载,可以对其进行修改以在每次执行中删除并创建索引。
有人可以建议哪种索引(如果有)或其他任何性能改进方法可以工作吗?
select语句如下:
SELECT
PERIOD,
CUENTA_ID,
PROD_ID,
TIPO_VENTA,
VENTA_EUROS,
CICLO,
DELEGADO_B2B,
SUM(VENTA_EUROS) OVER (PARTITION BY CUENTA_ID, PROD_ID, TIPO_VENTA,DELEGADO_B2B ORDER BY PERIOD ROWS BETWEEN 12 PRECEDING AND 12 PRECEDING) AS VENTA_EUROS_PREV,
SUM(VENTA_EUROS) OVER (PARTITION BY CUENTA_ID, PROD_ID, TIPO_VENTA,DELEGADO_B2B,YEAR ORDER BY PERIOD ROWS UNBOUNDED PRECEDING) AS VENTA_EUROS_YTD,
SUM(VENTA_EUROS) OVER (PARTITION BY CUENTA_ID, PROD_ID, TIPO_VENTA,DELEGADO_B2B,YEAR, CICLO ORDER BY PERIOD ROWS UNBOUNDED PRECEDING) AS VENTA_EUROS_CTD,
SUM(VENTA_EUROS) OVER (PARTITION BY CUENTA_ID, PROD_ID, TIPO_VENTA,DELEGADO_B2B ORDER BY PERIOD ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS VENTA_EUROS_MONTH_PREV,
SUM(VENTA_EUROS) OVER (PARTITION BY CUENTA_ID, PROD_ID, TIPO_VENTA,DELEGADO_B2B ORDER BY PERIOD ROWS 11 PRECEDING) AS VENTA_EUROS_MAT
FROM _REPORTING.[dbo].[RPT_VENTA_MENSUAL_STEP_1]
WHERE YEAR>=YEAR(DATEADD(day,-1,GETDATE()))-1
我检查了执行计划,占据最大百分比的部分是三种不同的“ OVER(PARTITION BY)”的三种排序方式
这是计划: https://www.brentozar.com/pastetheplan/?id=B1fsgwjBE
感谢与问候
答案 0 :(得分:0)
索引需要解决的第一件事是WHERE
子句。不幸的是,它有一个不等式,这几乎使优化器无法帮助使用窗口条款。
如果您有:
WHERE YEAR = YEAR(DATEADD(day, -1, GETDATE())) - 1
然后,优化器可以利用(YEAR, CUENTA_ID, PROD_ID, TIPO_VENTA, DELEGADO_B2B, PERIOD)
上的索引。