我试图提高一个使用Row_Number和Dense_Rank的查询的性能。我正在处理的数据相当大(4000多万行到1亿行)。虽然Row_Number和Dense_Rank通常在较小的数据集上非常有效,但我的查询可以运行30分钟到一个小时。
我已经在#Test表上应用了一个order by和一个索引,这提高了性能,但即使性能提高了,它仍然可以运行15分钟以上。我还尝试添加额外的索引,但无济于事。
此外,我还尝试将#Test表转换为CTE,但似乎并没有提高多少性能。
下面是我的代码以及我添加的索引和顺序。我是否应用了正确的索引来提高性能?我是否需要在索引中包含排除字段或改变顺序?除了改变索引之外,我还能做什么来提高性能吗?
IF OBJECT_ID('tempdb.dbo.#TEST') IS NOT NULL
DROP TABLE #TEST
select f.*
into #TEST
From (SELECT Cl.Field1
, Cl.Field2
, Cl.Field3
, Cl.Field4
, Cl.Field5
, Cl.Field6
, Cl.Field7
, Cl.Field8
, Cl.Field9
, Serv.Field10
, Serv.Field11
, Serv.Field12
, Cl.Field13
, Cl.Field14
, Cl.Field15
, sum(serv.Field16) as Field16
, Serv.Field17
, Serv.Field18
FROM #Cl Cl
INNER JOIN #Cl_Line L on Cl.Id = L.Id
INNER JOIN #Serv Serv ON Cl.Id = Serv.Id AND L.L_Nbr = Serv.L_Nbr
Group by Cl.Field1
, Cl.Field2
, Cl.Field3
, Cl.Field4
, Cl.Field5
, Cl.Field6
, Cl.Field7
, Cl.Field8
, Cl.Field9
, Serv.Field10
, Serv.Field11
, Serv.Field12
, Cl.Field13
, Cl.Field14
, Cl.Field15
, Serv.Field17
, Serv.Field18
) f
order by Field17, Field16 DESC, Field18
CREATE NONCLUSTERED INDEX Cl ON #TEST (Field2, Field3, Field6, Field7, Field5, Field4, Field8, Field9, Field11,
Field12, Field14, Field15, Field10, Field17, Field18, Field16 DESC)
INCLUDE (Field1, Field13)
IF OBJECT_ID('tempdb.dbo.#Cl_TEST') IS NOT NULL
DROP TABLE #Cl_TEST;
select c.*
into #Cl_TEST
From (select Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8
, Field9, Field10, Field11, Field12, Field13, Field14, Field15
, Field16, Field17, Field18
, DENSE_RANK() OVER (ORDER BY Field2, Field3, Field6, Field7, Field5, Field4, Field8, Field9, Field11,
Field12, Field14, Field15, Field10, Field17)
AS ERowGroup
, row_number() over (partition by Field2, Field3, Field6, Field7, Field5, Field4, Field8, Field9, Field11,
Field12, Field14, Field15, Field10, Field17 Order by Field17, Field16 desc)
AS ERow_Numbers
, DENSE_RANK() OVER (ORDER BY Field2, Field3, Field6, Field7, Field5, Field4, Field8, Field9, Field11,
Field12, Field14, Field15, Field10, Field18)
AS PRowGroup
, row_number() over (partition by Field2, Field3, Field6, Field7, Field5, Field4, Field8, Field9, Field11,
Field12, Field14, Field15, Field10, Field18 Order by Field18)
AS PRow_Numbers
FROM #TEST
) c
CREATE CLUSTERED INDEX Cl_Cx ON #Cl_Test (ERowGroup, PRowGroup)
IMHO,查询写得很差,所以没有必要在任何类型的Index startegy。
它需要完整的查询重写.为此我们需要知道需求,主要表的模式以及它们的数据类型。
为什么你需要在所有列中进行bY分组,然后再在尽可能多的列中使用窗口函数?
通过查看你的查询,可能有一个改进。
评论 Row_Number
从第一名开始。
然后在另一个查询中做 row_number()
在 ERowGroup
和 PRowGroup