You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ClickHouse中存储T-digest以准确计算多时段P99分位数

方案1:基于T-digest的存储与合并计算

这是最贴合你需求的方案,核心是存储T-digest的聚合状态而非直接存P99数值,后续通过合并状态计算更大时间窗口的分位数。

步骤1:创建存储T-digest的汇总表

ClickHouse中用AggregateFunction类型存储T-digest的聚合状态,示例表结构:

CREATE TABLE p99_5min_tdigest
(
    event_time DateTime,
    -- 按5分钟对齐的时间戳,方便后续分组
    window_start DateTime MATERIALIZED toStartOfInterval(event_time, INTERVAL 5 MINUTE),
    -- 存储0.99分位数的T-digest状态
    t_digest_state AggregateFunction(quantileTDigest(0.99), Float64)
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(event_time)
ORDER BY window_start;

如果你的数值类型是Int64等,把Float64改成对应类型即可;还可以加业务维度字段(比如service_name)一起作为ORDER BY的一部分。

步骤2:每5分钟写入T-digest状态

通过定时任务(比如ClickHouse的Materialized View或外部调度工具)将原始数据聚合为T-digest状态写入汇总表:

-- 假设原始数据表是raw_metrics,有event_time和latency字段
INSERT INTO p99_5min_tdigest
SELECT
    toStartOfInterval(event_time, INTERVAL 5 MINUTE) AS window_start,
    quantileTDigestState(0.99)(latency) AS t_digest_state
FROM raw_metrics
WHERE event_time >= now() - INTERVAL 5 MINUTE
GROUP BY window_start;

用quantileTDigestState函数生成可存储的聚合状态,而非直接计算出P99数值。

步骤3:合并T-digest计算更大窗口的P99

要计算10分钟的P99,只需合并两个相邻5分钟的T-digest状态,再提取分位数:

SELECT
    toStartOfInterval(window_start, INTERVAL 10 MINUTE) AS ten_min_window,
    -- 合并多个T-digest状态
    mergeQuantilesTDigest(t_digest_state) AS merged_digest,
    -- 从合并后的状态中提取P99
    quantileTDigestMerge(0.99)(merged_digest) AS p99_10min
FROM p99_5min_tdigest
WHERE window_start >= now() - INTERVAL 10 MINUTE
GROUP BY ten_min_window;
方案2:使用QuantileSketch替代T-digest

ClickHouse还支持QuantileSketch(基于Greenplum的分位数算法),同样支持状态存储与合并,用法和T-digest类似:

  1. 建表时用AggregateFunction(quantileSketch(0.99), Float64)类型
  2. 生成状态用quantileSketchState(0.99)(value)
  3. 合并状态用mergeQuantilesSketch,提取分位数用quantileSketchMerge(0.99)(merged_state)
    这个算法在某些场景下性能或精度表现可能优于T-digest,你可以根据实际测试选择。
方案3:存储原始分位数桶(适合小数据量场景)

如果你的单5分钟窗口数据量不大,可以直接存储该窗口内所有原始数据的分位数桶(比如按固定步长分桶),后续合并桶计算整体分位数。但这种方式存储空间占用远高于T-digest/QuantileSketch,只适合数据量较小的场景。


内容的提问来源于stack exchange,提问作者thayanee ruennark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:54:53