簡體   English   中英

分區中多列的 Row_Number 性能緩慢

[英]Slow performance of Row_Number with multiple columns in partition by

我正在嘗試提高使用 Row_Number 和 Dense_Rank 的查詢的性能。 我正在處理的數據相當大(40+ 百萬行到 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)

恕我直言,查詢寫得不好。所以任何類型的索引開始都沒有意義。

它需要完整的查詢重寫。為此,我們需要了解需求、主表架構及其數據類型。

為什么需要在所有列中對 bY 進行分組,然后在盡可能多的列中再次使用 window function ?

通過查看您的查詢,可能會有所改進。

從第一位評論Row_Number

然后在另一個查詢中執行ERowGroupPRowGroup中的row_number()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM