分区中多列的Row_Number性能缓慢,通过

问题描述 投票:0回答:1

我试图提高一个使用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)

sql sql-server performance tsql indexing
1个回答
0
投票

IMHO,查询写得很差,所以没有必要在任何类型的Index startegy。

它需要完整的查询重写.为此我们需要知道需求,主要表的模式以及它们的数据类型。

为什么你需要在所有列中进行bY分组,然后再在尽可能多的列中使用窗口函数?

通过查看你的查询,可能有一个改进。

评论 Row_Number 从第一名开始。

然后在另一个查询中做 row_number()ERowGroupPRowGroup

© www.soinside.com 2019 - 2024. All rights reserved.