拆解时序数据库的“存、导、查”:编码压缩、批量写入与超表机制的技术逻辑
本文从技术原理与实测数据两个层面,解析金仓时序数据库在工业场景下的三项核心优化:存储压缩、历史数据快速插入、时序超表。
一、问题定义:工业时序数据的负载特征
在工业互联网、能源数字化和智能制造场景中,时序数据具有一组非常稳定的负载特征。理解这些特征,是理解后文所有优化手段的前提。
| 特征 | 表现 | 对数据库的影响 |
|---|---|---|
| 规模大 | 设备数量多,观测点可达百万、千万级 | 总行数迅速进入百亿、千亿量级 |
| 增长快 | 采样频率高,持续不断写入 | 写入吞吐是长期压力,而非瞬时压力 |
| 周期长 | 历史数据需保留数年 | 存储成本随时间累积,压缩收益被不断放大 |
| 追加为主 | 数据基本按时间顺序产生,极少更新 | 可以针对顺序追加优化写入与存储 |
| 查询有规律 | 多为按时间范围、按设备的曲线或趋势查询 | 数据组织方式应贴合时间维度 |
通用关系型数据库的设计目标是兼顾各类事务与查询,面对上述负载时,会在存储冗余、批量写入效率和范围查询效率三处同时出现压力。金仓时序数据库的优化,正是分别针对这三处展开。
二、存储压缩:利用时序数据的内在规律
2.1 压缩为什么有效
数据压缩的本质,是识别并消除冗余。时序数据的冗余来自两个层面:
- 时间戳列:固定周期采集时,相邻时间戳的差值(间隔)基本恒定。
- 数值列:温度、电压、电量等物理量具有连续性,相邻采样点的数值通常非常接近。
如果采用行式存储,每一行都完整写入时间戳、设备标识和各项指标,这些可预测的内容就被重复存储了无数次。
2.2 四项技术的分工
金仓时序数据库在存储引擎层采用了 Delta-of-Delta 差值编码、Gorilla XOR 压缩、字典编码和列式存储优化。下面逐项说明其思路(原理为该类技术的通用机制,具体实现细节以产品文档为准)。
(1)Delta-of-Delta 差值编码:面向时间戳
普通差值编码(Delta)存储的是相邻两个值之差。Delta-of-Delta 则再对这个差值序列做一次差分,即存储“间隔的变化量”。
以每 15 秒采样一次为例:
原始时间戳: t0, t0+15, t0+30, t0+45, t0+60 一阶差分: - 15 15 15 15 二阶差分: - - 0 0 0采样间隔稳定时,二阶差分几乎全为 0,可以用极少的比特位表示,时间戳列的存储开销因此大幅降低。
(2)Gorilla XOR 压缩:面向浮点指标
Gorilla 方案对相邻两个浮点数的二进制表示做异或(XOR)运算。数值越接近,二进制表示的高位和符号位越相似,异或结果中就会出现大量连续的 0。此时只需记录结果中“有效位”的位置和内容,而不必存储完整的 64 位浮点数。
值 A: 0100 0000 0011 0101 ... 值 B: 0100 0000 0011 0101 ... (仅低位不同) A XOR B:0000 0000 0000 0000 ... 少量有效位对于变化平缓的工业指标,这种方式的压缩收益非常明显。
(3)字典编码:面向低基数字段
设备编码、状态标识、告警类型这类字段的特点是:行数很多,但不同取值很少(低基数)。字典编码将每个不同的取值映射为一个短整数编号,数据列只存编号,原始字符串只在字典中保存一份。
(4)列式存储优化:面向整体布局
列式存储把同一列的数据连续存放。同一列的数据类型一致、取值分布相似,前面三种编码方式才能充分发挥作用;同时,查询只涉及少数几列时,可以只读取所需列,减少无效 I/O。
小结
| 技术 | 作用对象 | 利用的数据规律 |
|---|---|---|
| Delta-of-Delta | 时间戳 | 采样间隔稳定 |
| Gorilla XOR | 浮点指标 | 相邻数值接近 |
| 字典编码 | 低基数标签 | 取值重复度高 |
| 列式存储 | 整体布局 | 同列数据同质 |
四项技术并不是替代关系,而是按列类型各司其职,再由列式布局把它们组织到一起。
2.3 实测结果
测试场景取自某省智能电表:
- 观测点数量:500 万个
- 数据周期:一年
- 数据总量:1956 亿行
- 实测压缩比:45:1
- 对比:约为业界水平的3.6 倍
可以做一个简单的估算:1956 亿行除以 500 万个观测点,平均每个观测点一年约产生 3.9 万行数据。在这样的体量下,哪怕每行节省很小的空间,累计起来也是可观的。压缩比从业界水平提升到 45:1,意味着同样的数据只占用原来很小一部分的物理空间,存储采购、机房占用和备份开销都会随之下降。
三、历史数据快速插入:面向批量加载的写入路径优化
3.1 两类写入场景需要区分
时序数据库的写入可以分为两类,它们的优化目标不同:
| 类型 | 特点 | 关注指标 |
|---|---|---|
| 实时写入 | 持续、小批量、低延迟 | 稳定的吞吐与延迟 |
| 历史数据批量加载 | 一次性、超大批量、集中导入 | 总耗时、平均吞吐 |
系统升级、数据迁移、数据平台建设、智能分析应用落地,都会触发第二类场景,数据量常常达到 TB 级甚至更大。
3.2 传统导入方式的瓶颈
通用的导入方式在大批量场景下,容易受制于两方面因素:
- 写入路径本身的开销:逐行处理、频繁的元数据与索引维护,在百亿、千亿行规模下会被成倍放大。
- 数据组织方式:数据入库时如果没有贴合时间维度进行组织,后续不仅写入效率下降,也会给查询和管理留下隐患。
3.3 金仓的优化方向
金仓时序数据库针对该场景,对面向时序的写入路径做了专门优化,使大规模历史数据的批量加载更为高效。其核心思路是:既然时序数据具备按时间顺序、以追加为主的特点,写入路径就可以围绕这一特点来精简,而不必完全沿用通用数据库的处理流程。
3.4 实测结果
在分布式部署环境下:
| 指标 | 数值 |
|---|---|
| 写入数据量 | 1956 亿行 |
| 总耗时 | 701 分钟 |
| 平均写入速度 | 465 万行/秒 |
| 对比业界 | 约 2.3 倍以上 |
我们可以做一次验算:701 分钟约为 42060 秒,1956 亿行除以 42060 秒,约等于 465 万行/秒,与公布的平均写入速度吻合。换算成时长,约为 11.7 小时,也就是说,近两千亿行的数据,在不到半天内即可完成入库。
这对项目交付的意义在于:数据迁移不再需要以“周”为单位排期,业务切换窗口和上线节奏更容易控制。
四、时序超表:按时间特征组织数据
4.1 为什么数据组织方式很关键
时序数据具备设备数量多、采样频率高、时间跨度长的特点。数据库对数据的物理组织,直接决定了两件事:
- 写入时,数据能否顺畅落到合适的位置;
- 查询时,能否迅速排除不相关的数据,只扫描所需的时间范围。
4.2 超表机制的基本思路
金仓时序数据库提供面向时序场景优化的数据组织方式,并通过时序超表机制提升海量数据的管理效率。从使用者角度看,超表仍然表现为一张逻辑上的表;从存储角度看,数据会按时间维度被合理切分与管理。这种方式带来的直接好处是,面向时间范围的查询可以更精准地定位数据,减少无效扫描。
4.3 与普通分区表的对比
对比测试的前提条件是:相同的数据规模,相同的表结构。
| 测试场景 | 时序超表 | 普通分区表 | 对比 |
|---|---|---|---|
| 实时插入 | 404 秒 | 549 秒 | 超表耗时更短,约快 26% |
| 曲线查询 | 253 毫秒 | 4834 毫秒 | 性能提升 19.1 倍 |
补充两点解读:
- 插入场景:404 秒对 549 秒,减少了约 145 秒,约 26% 的耗时。在持续写入的系统中,这种差距会随运行时间累积为稳定的吞吐优势。
- 查询场景:4834 除以 253 约等于 19.1,与公布结果一致。曲线查询是工业监控、趋势分析中最典型的操作,响应时间从接近 5 秒降至约 0.25 秒,使大屏、报表等需要频繁刷新的页面能够做到近似实时。
五、三项优化的协同关系
从数据生命周期来看,这三项优化覆盖了“存、导、查”三个环节:
历史数据 / 实时数据 │ ▼ ┌───────────────┐ │ 快速插入 │ ← 数据尽快入库,缩短上线周期 └───────┬───────┘ ▼ ┌───────────────┐ │ 高效压缩 │ ← 降低长期保存的存储成本 └───────┬───────┘ ▼ ┌───────────────┐ │ 时序超表 │ ← 提升管理与查询效率 └───────────────┘三者的关系可以这样理解:
- 只有压缩,没有快速导入:数据存得下,但迁移周期长,业务迟迟无法上线;
- 只有快速导入,没有压缩:数据能迅速入库,但存储成本随时间不断攀升;
- 导得快、存得省,但数据组织不合理:数据最终难以高效查询,价值无法释放。
因此,评价一款面向工业场景的时序数据库,不宜只看单项指标,而应关注这三个环节是否都有针对性的设计。
六、关键指标速览
| 维度 | 测试条件 | 结果 | 对比 |
|---|---|---|---|
| 压缩 | 500 万观测点,一年 1956 亿行 | 压缩比 45:1 | 约为业界 3.6 倍 |
| 批量写入 | 分布式部署,1956 亿行 | 701 分钟,平均 465 万行/秒 | 约为业界 2.3 倍以上 |
| 实时插入 | 时序超表 vs 普通分区表 | 404 秒 vs 549 秒 | 超表更快 |
| 曲线查询 | 时序超表 vs 普通分区表 | 253 毫秒 vs 4834 毫秒 | 提升 19.1 倍 |
七、总结
随着企业数字化建设的深入,时序数据正在成为支撑业务分析、设备运维和智能决策的重要数据资源。数据规模持续增长,对数据库的要求也从“能写入”升级为“能长期承载、能高效管理”。
金仓时序数据库的思路,是从时序数据自身的规律出发:用编码与列式存储压缩冗余,用面向时序的写入路径提升批量加载效率,用时序超表改善数据组织与查询表现。三项能力共同作用,帮助企业降低海量数据的存储成本,提高数据加载效率,让持续增长的时序数据更好地服务于业务。
说明:本文中 Delta-of-Delta、Gorilla XOR、字典编码等技术的原理说明,为该类技术的通用机制解读,具体到产品内部实现与参数,请以金仓官方文档为准。