返回

文章详情

TimescaleDB如何压缩时间序列数据

Hacker News2026年6月15日 17:29

TimescaleDB可以实现高达98%的典型时间序列数据压缩。压缩时间序列数据需要与OLTP数据库中使用的通用算法 fundamentally 不同的方法。 在TimescaleDB中,这由hypercore引擎处理 - 一种混合行列存储引擎,使用专门的算法:增量编码、增量增量、Gorilla XOR和游程长度编码。 本文解释了其工作原理以及如何配置压缩以确保实际实现该比率。 TimescaleDB压缩 - 与PostgreSQL TOAST的区别 PostgreSQL有一个内置机制称为TOAST(超大属性存储技术),但TimescaleDB压缩解决了根本上不同的问题。 TOAST处理单个大值(长字符串、jsonb、bytea),而TimescaleDB压缩优化时间序列数据中的跨行模式。这两种机制是互补的,而不是竞争的 - TimescaleDB甚至在内部使用TOAST作为某些数据类型的后备。 PostgreSQL使用固定的“页面大小”,通常为8 KB,并且不允许元组跨多个页面。因此,当字段值很大时,数据必须在多个物理行之间进行压缩和/或拆分。 特性 TOAST(普通PostgreSQL) TimescaleDB hypercore 设计目标 单个值 > 2 KB 时间序列中的跨行模式 触发器 行超出TOAST_TUPLE_THRESHOLD(约2 KB) 每个块策略(例如,超过7天) 支持的类型 仅可变长度(文本、jsonb、bytea、numeric) 所有数据类型 算法 pglz(默认)、lz4(自PG14起,自愿选择) 组合:增量编码、增量增量、简单8b、游程长度编码、基于XOR的、字典压缩 压缩粒度 每个值(1值=1字节流) 每批(~1000行一起) 利用数据结构 没有 - 将值视为不透明的字节 是 - 利用数值结构、单调性、重复性 传感器浮点数的典型比率 ~1.0×(无压缩) 10-20× 时间戳的典型比率 ~1.0×(无压缩 - 固定长度类型) 50-100×(对于规律间隔的增量增量) 文本的典型比率 2-3×(通用LZ) 5-10×(如果重复则字典+ RLE) 表显示了差异的规模。 对于典型的物联网工作负载,包含浮点数和时间戳 - 即TOAST完全不压缩的列 - TimescaleDB达到了10-100×的比率,因为它是为这种类型的数据构建的。 Hypercore引擎和列式压缩 在TimescaleDB中,由一个名为hypercore的引擎处理压缩 - 一种混合行列式引擎,其中新数据以Postgres基于行的块进入(快速INSERT和UPDATE),而较旧的块则自动转换为列式压缩格式。 读取这些压缩数据的分析查询读取的字节更少,运行更快。 这种转换使得压缩高达98%,显著降低了长期数据保留项目的存储成本。 与传统的基于行的存储不同,在基于行的存储中,数据按行顺序存储,而列式存储则按列组织和压缩数据。因此,查询可以批量获取仅需的字段,而不是扫描整个行。 行的处理 将一个块转换为将行分组为多达1000个批次,每个批次在压缩表中成为单行,列是数组。 每个压缩批次: 封装以压缩数组形式的列式数据,每列最多1000个值,作为压缩表中的单个条目。 在批次内部使用列主格式,使得通过将同一列的值放在一起来实现高效扫描,并允许您在不读取整个批次的情况下选择单独的列。 应用先进的列级压缩技术 - 游程长度编码、增量编码、Gorilla压缩 - 减少存储并改善I/O。 来源: https://www.tigerdata.com/docs/learn/deep-dive/whitepaper#data-model 使用增量编码的压缩示例: 时间 机器ID 传感器类型 值 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 使用增量编码只需存储每个值相对前一个数据点变化的幅度,这意味着要存储的值更小。在第一行之后,您可以使用更少的信息表示后面的行,例如: 时间 机器ID 传感器类型 值 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度,然后突然上升到73.0度并保持在该温度10分钟,则可以使用增量增量编码。如果间隔是恒定的(例如,总是5秒),

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡