带有窗口功能的最佳查询索引

时间:2019-02-20 00:46:19

标签: sql sql-server tsql

我在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

感谢与问候

1 个答案:

答案 0 :(得分:0)

索引需要解决的第一件事是WHERE子句。不幸的是,它有一个不等式,这几乎使优化器无法帮助使用窗口条款。

如果您有:

WHERE YEAR = YEAR(DATEADD(day, -1, GETDATE())) - 1

然后,优化器可以利用(YEAR, CUENTA_ID, PROD_ID, TIPO_VENTA, DELEGADO_B2B, PERIOD)上的索引。