在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和大数据分析等场景尤为重要。