Amazon redshift 使用红移百分比计算中位数
我有一个超过1800万行的大表,我想计算中间值,我使用的是Precentle。然而,所需时间约为17分钟,这并不理想 这是我的问题Amazon redshift 使用红移百分比计算中位数,amazon-redshift,percentile,Amazon Redshift,Percentile,我有一个超过1800万行的大表,我想计算中间值,我使用的是Precentle。然而,所需时间约为17分钟,这并不理想 这是我的问题 WITH raw_data AS ( SELECT name AS series, (duration) /(60000) AS value FROM warehouse.table ), quartiles AS ( SELECT series, value, PERCENTILE_CONT(0.2
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做大量工作。数据必须根据您的分区列进行分布,数据必须根据您的按列排序进行排序 有两种方法可以加快速度: 使用更多的硬件。红移性能非常线性扩展。大多数查询在2倍多的硬件上运行的速度是原来的2倍。 提前做一些工作。通过重新构造表,可以最大限度地提高此查询的性能。使用分区列作为分发键DISTKEYseries和第一个排序键。使用ORDER BY列作为第二个排序键SORTKEYseries的值。这将最大限度地减少回答查询所需的工作量。节省的时间会有所不同,但在我的小测试集群上,使用这种方法,我看到3m30s百分位控制查询下降到30s。
要加快部分速度,请尝试以下操作
SELECT distinct
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 warehouse.table
这可能会更快,因为它更有可能正确使用表的排序/距离。
您必须在其他地方计算最小值和最大值。但至少要看看它是否运行得更快。您可以尝试近似百分位功能,该功能针对低错误率的分布式数据进行了优化,包括将为0.5的中值。我对您的计时/数据量感到惊讶!还有其他的吗?您有多少个节点是什么类型的?我刚刚用2600万行数据运行了你的代码,耗时45秒。在大型数据库中,中位数和百分位数的计算相当困难,因此我预计需要<45秒的时间。我正在使用8个计算节点。嗨,Jon,谢谢你的建议。然而,在使用您的建议后,我发现改进超过了2分钟