NeFut Logo NeFut
EN 管理员登录

[算法硬核] 惊爆!TimescaleDB如何实现高达98%的时间序列数据压缩

发布于:2026-06-15 22:00 最后更新:2026-06-16 12:15
#optimization #C++ #Database

在TimescaleDB中,时间序列数据的压缩可以达到高达98%。这一过程与传统OLTP数据库中使用的通用算法截然不同,TimescaleDB采用了名为hypercore的引擎,它是一种混合行列存储引擎,利用了多种专门的压缩算法:增量编码、增量差的差值、Gorilla XOR和游程编码。

TimescaleDB压缩与PostgreSQL的TOAST机制的区别

PostgreSQL有一个内置的TOAST机制(超大属性存储技术),但TimescaleDB的压缩解决了一个根本不同的问题。TOAST主要处理单个大值(如长字符串、jsonb、bytea),而TimescaleDB的压缩则优化了时间序列数据中的跨行模式。这两种机制是互补的,TimescaleDB甚至在某些数据类型上内部使用TOAST作为回退。

特性对比

特性 TOAST (原生PostgreSQL) TimescaleDB hypercore
设计目标 单个值 跨行模式
触发条件 行超过TOAST_TUPLE_THRESHOLD (~2 KB) 每个块策略(例如,超过7天)
支持类型 可变长度(text, jsonb, bytea, numeric) 所有数据类型
压缩算法 pglz(默认),lz4(自PG14起,需选择) 组合:增量编码、增量差的差值、simple-8b、游程编码、基于XOR、字典压缩
压缩粒度 每个值(1值=1字节流) 每批次 (~1000行)
数据结构利用

Hypercore引擎与列式压缩

在TimescaleDB中,压缩由名为hypercore的引擎处理。新数据以Postgres行式块的形式存储(快速的INSERT和UPDATE),而旧块会自动转换为列式压缩格式。分析查询读取这些压缩数据时,读取字节更少,运行更快。这种转换使压缩达到高达98%,显著降低了长期数据保留项目的存储成本。

示例:增量编码的压缩

使用增量编码时,只需存储每个值相对于前一个数据点的变化。例如:

time machine_id sensor_type value
12:00:00 MACHINE_001 temp 72.5
12:00:00 MACHINE_001 speed 2.0
12:00:05 MACHINE_001 temp 72.7
12:00:05 MACHINE_001 speed 2.1

在时间序列数据中,某些值会在一段时间内重复。通过增量差的差值编码,若间隔固定(例如,每5秒),则可以用极少的位数存储。

如何实施

要配置列存储以监控IoT传感器:

ALTER TABLE iot_sensor_data SET (
  timescaledb.compress,
  timescaledb.segmentby = 'machine_id',
  timescaledb.orderby = 'time DESC'
);

博主点评:

TimescaleDB的压缩技术为处理大量时间序列数据提供了强大的支持,通过灵活的算法组合和列式存储,显著提高了存储效率和查询性能。对IoT和大数据分析等场景尤为重要。

原文链接: https://roszigit.com/en/blog/timescaledb-compression-hypercore

[h] 返回首页