我们编写了一个查询,其中包括 unpivot、partition by 和 order by。
查询是:
SELECT PersonId
,SalaryDate
,ID
,Type
,SalaryValue
,ROW_NUMBER() OVER (
PARTITION BY PersonId ORDER BY SalaryValue
) AS rn
FROM (
SELECT lp.PersonId
,lp.SalaryDate
,lp.Salary1
,lp.Salary2
,lp.Salary3
,lp.ID
FROM rdd.Salaries AS lp WITH (NOLOCK)
WHERE lp.SalaryDate > DATEADD(day, - 31, getdate())
) AS t
unpivot(SalaryValue FOR Type IN (
lp.Salary1
,lp.Salary2
,lp.Salary3
)) AS UnpivotTable
查询返回大约 68.000.000 行,执行时间为 20 分钟。
我可以提高查询的性能或有效地重写吗?
partition by 的替代方案是什么?
您可能会发现以下索引和查询重写执行得更好,因为它对每个人进行排序而不是对整个集合进行一次排序,并且行估计更有可能是准确的:
OPTION
如果您发现并行查询是自然生成的,或者如果您发现非并行性能足够好,则可以省略该子句。想要的平面形状大致如下: