[英]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
。
然后在另一個查詢中執行ERowGroup
和PRowGroup
中的row_number()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.