SQL百分比计算运行速度非常缓慢 - 需要帮助加快速度

SQL百分比计算运行速度非常缓慢 - 需要帮助加快速度

问题描述:

我有一张大表(现在大约有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

把不同的子查询:

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

distinct应该发生所有select列已计算。

+0

这不会改变执行计划,Windowed Aggregates是* * distinct * – dnoeth

+0

@dnoeth之前计算的。 。 。究竟。如果给定行有100份,则计算100次。据推测OP应用独特后的窗口函数值。 –

+1

但百分位数通常是在完整数据集上计算的,事先应用DISTINCT可能会改变结果。 – dnoeth