分位数函数怎么用
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) | 与业务口径里的中位数对应 |
分位数由聚合状态计算,可以物化到预聚合表并持续合并;查长周期趋势时用预聚合结果比扫描明细快得多,也更省内存。
分组内样本过少时分位数波动很大,报表要在同一张图里给出样本量,否则读数容易被小样本误导。