amazon-redshift - 在 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
有没有办法可以加快速度?
谢谢
解决方案
您的查询要求 Redshift 做很多工作。数据必须根据您的列分布,PARTITION
并根据您的列排序ORDER BY
。
有两个选项可以使它更快:
- 使用更多的硬件。Redshift 性能非常线性地扩展。大多数查询在 2 倍硬件上的运行速度是 2 倍。
- 提前做一些工作。您可以通过重组表来最大化此查询的性能。使用该
PARTITION
列作为分布键 (DISTKEY(series)
) 和第一个排序键。使用该ORDER BY
列作为第二个排序键 (SORTKEY(series,value)
)。这将最大限度地减少回答查询所需的工作。节省的时间会有所不同,但我看到PERCENTILE_CONT
在我的小型测试集群上使用这种方法的 3 分 30 秒查询下降到 30 秒。
推荐阅读
- python - 如何顺序处理多个标准输入到python?
- ios - App Review Information 部分未保存在 App Store Connect 中
- c++ - 如何比较两个字符串?这是我的代码,它没有给出想要的结果。它没有正确比较
- flutter - 如何从 Flutter 中的 URL 下载到记录器
- android - Android api 21/22 android version 5 视频播放问题, video play throws error 无法播放视频
- reactjs - 为什么在反应的“useState”钩子中一遍又一遍地设置初始状态
- django - 如何根据基于 django 的角色添加删除视图
- graphics - 如何将此 HLSL 像素着色器更正为四边形的圆角?
- javascript - 我的离线网站与离线网站的显示方式不同(图片不会显示)
- html - VS代码自动标记完成仅选择结束标记