2017-09-17 67 views
0

我有一張大表(現在大約有8.5億行),並且需要在插入新數據時每週計算百分位數值,靜態數據會變得很髒。但是,該過程非常慢(使用我的硬件/當前查詢5-6小時)。SQL百分比計算運行速度非常緩慢 - 需要幫助加快速度

如何更改我的查詢以加快查詢速度?

現在,我的查詢基本上是這樣的:

SELECT DISTINCT [ident1] 
    ,[ident2] 
    ,[ident3] 
    ,[ident4] 
    ,percentile_cont(0.05) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_5] 
    ,percentile_cont(0.10) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_10] 
    ,percentile_cont(0.25) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_25] 
    ,percentile_cont(0.50) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_50] 
    ,percentile_cont(0.75) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_75] 
    ,percentile_cont(0.90) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_90] 
    ,percentile_cont(0.95) 
     WITHIN GROUP (
      ORDER BY [value] ASC 
     ) OVER (
      PARTITION BY [ident1] 
       ,[ident2] 
       ,[ident3] 
       ,[ident4] 
     ) AS [percentile_95] 
FROM dataTable 

認爲這個問題的一部分是用出來的DISTINCT選擇我得到一個排在DB的每個值。 SQL是否足夠聰明,可以爲每個組計算一次百分位數?或者是爲每個值重複計算?

任何幫助將不勝感激。

+0

您需要百分數_ **續**還是可以使用百分數_ **光盤**? – dnoeth

+0

執行計劃告訴你關於這個查詢的內容是什麼? (首先看看應該是一個執行計劃。)例如,它可能會識別缺少的索引。 –

+0

我正在努力獲取執行計劃。我的DBA此時禁用了該功能。同時,什麼是索引這個最好的方法? [ident1],[ident2],[ident3],[ident4]和[value]上的聚簇索引或者也許是列的一些子集? – hoytdj

回答

0

把不同的子查詢:

select . . . 
from (select distinct . . .) s; 

distinct應該發生所有select列已計算。

+0

這不會改變執行計劃,Windowed Aggregates是* * distinct * – dnoeth

+0

@dnoeth之前計算的。 。 。究竟。如果給定行有100份,則計算100次。據推測OP應用獨特後的窗口函數值。 –

+1

但百分位數通常是在完整數據集上計算的,事先應用DISTINCT可能會改變結果。 – dnoeth