首页 > 解决方案 > 在 Redshift 上使用百分位数计算中位数

问题描述

我有一个超过 1800 万行的大表,我想计算中位数,为此我使用 PRECENTILE。然而,所花费的时间约为 17 分钟,这并不理想。

这是我的查询

WITH raw_data AS
(
  SELECT name AS series,
         (duration) /(60000) AS value
  FROM warehouse.table
),
quartiles AS
(
  SELECT series,
         value,
         PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY value) OVER (PARTITION BY series) AS q1,
         MEDIAN(value) OVER (PARTITION BY series) AS median,
         PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY value) OVER (PARTITION BY series) AS q3
  FROM raw_data
)
SELECT series,
       MIN(value) AS minimum,
       AVG(q1) AS q1,
       AVG(median) AS median,
       AVG(q3) AS q3,
       MAX(value) AS maximum
FROM quartiles
GROUP BY 1

有没有办法可以加快速度?

谢谢

标签: amazon-redshiftpercentile

解决方案


您的查询要求 Redshift 做很多工作。数据必须根据您的列分布,PARTITION并根据您的列排序ORDER BY

有两个选项可以使它更快:

  1. 使用更多的硬件。Redshift 性能非常线性地扩展。大多数查询在 2 倍硬件上的运行速度是 2 倍。
  2. 提前做一些工作。您可以通过重组表来最大化此查询的性能。使用该PARTITION列作为分布键 ( DISTKEY(series)) 和第一个排序键。使用该ORDER BY列作为第二个排序键 ( SORTKEY(series,value))。这将最大限度地减少回答查询所需的工作。节省的时间会有所不同,但我看到PERCENTILE_CONT在我的小型测试集群上使用这种方法的 3 分 30 秒查询下降到 30 秒。

推荐阅读