开发者生态
evening
TimescaleDB如何压缩时间序列数据
2026-06-15
1 阅读
lkanwoqwp
亚历山大·罗齐格 2026 年 5 月 29 日 | 12 分钟读取 TimescaleDB 压缩:PostgreSQL 中高达 98% 比率的超核和列式存储 TimescaleDB 可以对典型时间序列数据实现高达 98% 的压缩。压缩时间序列数据需要采用与 OLTP 数据库中使用的通用算法完全不同的方法。在 TimescaleDB 中,这是由超核引擎处理的 - 一种混合行列引擎,使用专门的算法:增量编码、增量增量、Gorilla XOR 和游程编码。本文介绍了它的工作原理以及如何配置压缩以便您实际达到该比率。 TimescaleDB 压缩 - 与 PostgreSQL TOAST 有何不同 PostgreSQL 有一个名为 TOAST(超大属性存储技术)的内置机制,但 TimescaleDB 压缩解决了一个根本不同的问题。 TOAST 处理单个大值(长字符串、jsonb、bytea),而 TimescaleDB 压缩优化时间序列数据中的跨行模式。这两种机制是互补的,而不是竞争的——TimescaleDB 甚至在内部使用 TOAST 作为某些数据类型的后备。 PostgreSQL 使用固定的“页面大小”,通常为 8 kB,并且不允许元组跨越多个页面。因此,当字段值非常大时,必须将数据压缩和/或拆分到多个物理行。功能 TOAST (vanilla PostgreSQL) TimescaleDB hypercore 设计目标 单个值 > 2 KB 时间序列中的跨行模式 触发行超过 TOAST_TUPLE_THRESHOLD (~2 KB) 每块策略(例如超过 7 天) 支持的类型 仅可变长度( text 、 jsonb 、 bytea 、 numeric ) 所有数据类型 算法 pglz (默认)、lz4 (自PG14,选择加入) 组合:delta 编码、delta-of-delta、simple-8b、游程编码、基于 XOR、字典压缩 压缩粒度 每个值(1 个值 = 1 个字节流) 每批(总共约 1000 行) 利用数据结构 否 - 将值视为不透明字节 是 - 利用数字结构、单调性、重复 传感器浮点的典型比率 ~1.0×(无压缩) 10-20×时间戳的典型比率 ~1.0×(无压缩 - 固定长度类型) 50-100×(规则间隔的 delta-of-delta) 文本的典型比率 2-3×(通用 LZ) 5-10×(字典 + RLE,如果重复) 下表显示了差异的规模。对于具有浮点和时间戳的典型 IoT 工作负载(即 TOAST 列根本不压缩),TimescaleDB 达到 10-100× 的比率,因为它是为此类数据构建的。 Hypercore 引擎和列式压缩 在 TimescaleDB 中,压缩是由一个称为 hypercore 的引擎处理的,这是一种混合行列式引擎,其中新数据以 Postgres 基于行的块(快速插入和更新)的形式存储,而旧块会自动转换为列式压缩格式。读取此压缩数据的分析查询读取的字节更少并且运行速度更快。此转换可实现高达 98% 的压缩,从而显着降低长期数据保留项目的存储成本。与传统的基于行的存储(数据按行顺序存储)不同,列式存储按列组织和压缩数据。因此,查询可以批量只获取必要的字段,而不是扫描整行。行会发生什么情况转换块将行分组为最多 1000 个批次,每个批次成为压缩表中的一行,其中列是数组。每个压缩批次:将列式数据封装在每列最多 1000 个值的压缩数组中,作为单个条目存储在压缩表中。在批处理中使用列主格式,通过共置同一列的值来实现高效扫描,并允许您选择单个列而无需读取整个批处理。应用先进的列级压缩技术——游程编码、增量编码、Gorilla 压缩——减少存储并改进 I/O。来源:https://www.tigerdata.com/docs/learn/deep-dive/whitepaper#data-model 使用增量编码的压缩示例: time machine_idsensor_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 12:00:10 MACHINE_001 temp 72.4 12:00:10 MACHINE_001 speed 2.4 使用增量编码,您只需要存储每个值相对于前一个数据点的变化量,这意味着要存储的值更小。在第一行之后,您可以使用较少的信息来表示以下行,例如: time machine_idsensor_type value 12:00:00 MACHINE_001 temp 72.5 0秒 MACHINE_001 speed 2.0 5秒 MACHINE_001 temp +0.2 0秒 MACHINE_001 speed +0.1 5秒 MACHINE_001 temp -0.3 0秒MACHINE_001 speed +0.3 在时间序列数据中,经常会出现某些值在某个时期内重复的情况。例如,如果您的温度传感器在 10 分钟内读数为 72.5 度,然后突然升高