首页/数据/NoSQL 速查/分位数函数 quantile
ClickHouse56 条

分位数函数 quantile

quantile(q)(x) 计算分位数,quantiles(q1, q2)(x) 一次返回多个分位:P95、P99 等延迟指标常用;也有 quantileExact、quantileTiming 等按精度与耗时特征区分。

NoSQL 速查数据更新于 2026-10-13

分位数函数怎么用

quantile(level)(x) 计算单个分位数,quantiles(q1, q2)(x) 一次返回多个分位,level 取 0 到 1 之间的小数。延迟类指标常用 P95 与 P99,报表里一般要和样本量一起展示,否则小样本的波动很容易被当成真实变化。

不同变体怎么取舍

常见变体的差别在精度与资源占用:quantile 是近似实现、省内存;quantileExact 精确但更耗资源;quantileTiming 针对耗时类数值做了优化。median 等价于 quantile(0.5)。分位计算基于聚合状态,可以物化到预聚合表并持续合并。

窗口与分组的影响

分位数对时间窗口敏感:同一接口在工作时段与低谷时段的 P99 会明显不同,看板要固定窗口长度再比较。分组维度越细,每组样本越少,波动也越大;按接口分组时把样本数低于阈值的组过滤掉,趋势图才有可读性。

基本信息

语法quantile(level)(expr),level 取 0 到 1 的小数
多分位quantiles(0.5, 0.9, 0.99)(response_ms) 返回数组
变体quantileExact 精确、quantileTiming 适合耗时分布
等价写法median(x) 等价于 quantile(0.5)(x)
预聚合用 quantilesState 存聚合状态,读取时配 quantilesMerge

示例

示例
SELECT toStartOfHour(ts) AS h, quantiles(0.5, 0.95, 0.99)(response_ms) AS qs, count() AS samples
FROM http_logs GROUP BY h ORDER BY h DESC LIMIT 24;

SELECT quantile(0.95)(response_ms) AS p95, median(response_ms) AS p50 FROM http_logs;

SELECT path, count() AS n, round(quantile(0.99)(response_ms), 1) AS p99
FROM http_logs GROUP BY path ORDER BY n DESC LIMIT 10;

典型使用场景

  • 延迟看板:接口耗时的 P50、P95 与 P99 走势
  • 容量评估:按分位数判断极端值的规模与影响面
  • 告警阈值:用 P99 而不是平均值触发告警
  • 预聚合:把小时级分位状态物化,长周期查询不必扫明细
  • 精度核对:对比近似与精确实现的差异,确认精度是否够用

函数对照

函数特点使用建议
quantile近似实现,内存占用低看板与趋势分析
quantiles一次返回多个分位报表一次取 P50、P95、P99
quantileExact精确实现,资源开销更高对账与精度要求高的场景
quantileTiming针对耗时类数值优化毫秒量级的延迟指标
median等价于 quantile(0.5)与业务口径里的中位数对应
分位数由聚合状态计算,可以物化到预聚合表并持续合并;查长周期趋势时用预聚合结果比扫描明细快得多,也更省内存。
分组内样本过少时分位数波动很大,报表要在同一张图里给出样本量,否则读数容易被小样本误导。

易错点

  • 分组内样本过少时 P99 波动很大,报表必须同时给出样本量,否则一次抖动就会被当成故障
  • 对已经聚合过的均值列再求分位数没有统计意义,先确认数据处在明细层还是聚合层
  • 近似实现与精确实现在同一指标上会有差异,跨报表对比之前先统一算法与函数选型
  • 把 P99 当成典型值对外汇报会高估常态体验,分位数要与均值、样本量一起解读

数据来源与参考

  • ClickHouse Docs: quantile functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌