tdigest

tdigest 聚合函数

概览

扩展包名版本分类许可证语言
tdigest1.4.4FUNCApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
4700tdigest-
相关扩展pg_idkit pgx_ulid pg_uuidv7 pg_hashids sequential_uuids topn quantile lower_quantile

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.4.41817161514tdigest-
RPMPGDG1.4.41817161514tdigest_$v-
DEBPGDG1.4.41817161514postgresql-$v-tdigest-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

安装

您可以直接安装 tdigest 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install tdigest;          # 当前活跃 PG 版本安装
pig ext install -y tdigest -v 18  # PG 18
pig ext install -y tdigest -v 17  # PG 17
pig ext install -y tdigest -v 16  # PG 16
pig ext install -y tdigest -v 15  # PG 15
pig ext install -y tdigest -v 14  # PG 14
dnf install -y tdigest_18       # PG 18
dnf install -y tdigest_17       # PG 17
dnf install -y tdigest_16       # PG 16
dnf install -y tdigest_15       # PG 15
dnf install -y tdigest_14       # PG 14
apt install -y postgresql-18-tdigest   # PG 18
apt install -y postgresql-17-tdigest   # PG 17
apt install -y postgresql-16-tdigest   # PG 16
apt install -y postgresql-15-tdigest   # PG 15
apt install -y postgresql-14-tdigest   # PG 14

创建扩展

CREATE EXTENSION tdigest;

用法

来源:

tdigest 实现了近似可合并的 t-digest,用于在线排名统计,如分位数、百分位秩和截尾均值。它支持并行聚合,并可以存储预聚合的摘要以便后续汇总。

CREATE EXTENSION tdigest;

直接聚合函数

函数描述
tdigest_percentile(value, compression, quantile)估算单一百分位数
tdigest_percentile(value, compression, quantiles[])估算多个百分位数
tdigest_percentile_of(value, compression, value)估算值的百分位秩
tdigest_percentile_of(value, compression, values[])估算多个值的百分位秩

预聚合函数

函数描述
tdigest(value, compression)从值构建 t-digest
tdigest_percentile(digest, quantile)从预构建的摘要估算百分位数
tdigest_percentile(digest, quantiles[])从预构建的摘要估算多个百分位数

增量更新函数

函数描述
tdigest_add(digest, value)将单个值添加到现有摘要中
tdigest_add(digest, values[])将数组中的值添加到现有摘要中
tdigest_union(digest, digest)合并两个摘要

辅助函数

函数描述
tdigest_count(digest)返回摘要中的项数
tdigest_sum(digest, low, high)在值范围内截尾求和
tdigest_avg(digest, low, high)在值范围内截尾平均

参数

  • compression – 控制准确性(越高 = 越准确,摘要越大)。误差大致为 1/compression

示例

-- Instead of: SELECT percentile_cont(0.95) WITHIN GROUP (ORDER BY a) FROM t;
SELECT tdigest_percentile(a, 100, 0.95) FROM t;

-- Multiple percentiles
SELECT tdigest_percentile(a, 100, ARRAY[0.5, 0.95, 0.99]) FROM t;

-- Pre-aggregate for fast repeated queries
CREATE TABLE p AS SELECT a, b, tdigest(c, 100) AS d FROM t GROUP BY a, b;

-- Query pre-aggregated data (~1.5ms vs ~7s for exact)
SELECT a, tdigest_percentile(d, 0.95) FROM p GROUP BY a ORDER BY a;

注意事项

  • 结果是估算的。在设置精度目标之前,请使用代表性的数据验证所选压缩参数与精确 percentile_cont 结果。
  • 较高的压缩通常会提高尾部准确性,但会增加状态大小和 CPU 成本。
  • 存储的摘要可以在不同组和时间窗口之间合并。版本 1.4.4 修复了使用不同参数创建的摘要结合的问题,因此在异构状态可能相遇时,请使用该补丁级别。
  • 版本 1.4.4 还增强了文本输入解析和验证,并增加了 PostgreSQL 19 的构建/测试覆盖率;以前被较旧版本接受的格式错误的序列化摘要现在可能会被拒绝。