1 -> 引言
一块智能电表每次上传的数据并不多,但当设备数量达到数百万、采集持续数年时,数据库面对的就不再是几张不断增长的表,而是一套需要长期运转的数据存储和处理体系。
工业监测、能源管理和生产制造都有类似的特点:新数据不断进入,历史数据不能随意删除,业务还需要随时查看某台设备的运行曲线、追溯异常发生前后的变化。数据库既要承受持续写入,也要控制存储开销,并让查询速度保持在可接受的范围内。
围绕这些问题,KES 时序数据库的优化主要涉及三个方面:利用数据规律提高压缩效率,加快历史数据批量加载,以及通过面向时序场景的数据组织方式改善访问效率。理解这些能力,需要把技术原理与具体测试结果放在一起看。
2 -> 压缩的关键,是减少重复表达的信息
时序数据虽然体量庞大,却往往具有明显的规律。设备可能每隔固定时间采集一次,测量值在相邻时刻之间变化有限,同一类设备的部分属性也会反复出现。如果每条记录都独立保存全部信息,就会重复存储很多本来可以简化表达的内容。
所提供材料介绍,KES 使用了 Delta-of-Delta 差值编码、Gorilla XOR 压缩、字典编码和列式存储优化。这几种技术处理的对象不同,并不是把同一种压缩算法简单地应用到所有字段上。
以时间戳为例,假设设备分别在第 0、10、20、30、41 秒上传数据,相邻时间间隔是 10、10、10、11 秒,间隔之间的变化则是 0、0、1。Delta-of-Delta 的思路,就是进一步编码“时间间隔的变化”。采样越规律,这部分信息通常越容易用较少的位数表示。
Gorilla XOR 则面向数值的二进制表示。它对相邻数值的位模式进行异或,利用其中未变化的部分减少记录量,并不是简单计算两个浮点数的算术差值。这两种思路都可以在 Gorilla 原始论文中找到对应说明。
字典编码适合处理重复出现的属性值,例如设备类型或区域名称,用较短的编码代替重复字符串;列式组织则让同类字段集中存放,便于针对不同数据类型选择编码方式。不过,重复程度、数值波动和字段取值数量都会影响效果,并不是所有数据都能获得相同的压缩比。
根据所提供材料,在某省智能电表场景中,针对 500 万个观测点、一年累计 1956 亿行数据的测试,KES 的压缩比达到 45∶1。从比例上理解,如果压缩前后的统计口径一致,压缩后数据体积约为原来的 2.22%。
这个数字说明了特定数据集的压缩潜力,但不能直接等同于整个生产系统的磁盘成本降低了同样的比例。实际容量规划还需要考虑索引、日志、副本、备份以及维护所需的临时空间。
3 -> 历史数据导入,和实时写入不是同一个问题
实时采集关心的是数据库能否持续接收新数据,以及写入延迟是否稳定。历史数据导入则更像一次集中搬迁:将过去数月甚至数年的记录,在有限时间内装载到新的环境中。
两者虽然都在“写数据”,工作负载却不同。历史导入通常可以组织较大的批次,也更容易提前整理数据;实时写入则需要面对持续到达的请求,还可能同时承担查询任务。因此,批量导入成绩不能直接当作日常在线写入能力。
所提供材料显示,KES 在分布式部署环境下,将 1956 亿行历史数据写入完成,耗时 701 分钟,即约 11 小时 41 分钟。按总行数除以总耗时计算,平均速度约为 465 万行/秒,与材料公布的数值基本一致。
对于系统迁移或历史数据平台建设,这类能力的价值在于缩短数据装载阶段。历史记录越多,导入时间越容易成为上线准备中的主要耗时环节。
但装载完成也不意味着迁移完成。数据是否齐全、时间范围是否连续、重复记录如何处理、导入后查询是否正确,都需要单独验证。材料没有展开批次大小、并发数、索引状态和持久化配置,因此不能仅凭这个结果反推出具体实现,也不宜把它视为任意环境下都能达到的速度。
4 -> 查询能否足够快,还取决于数据怎样组织
数据压缩之后占用更少空间,导入之后进入了数据库,但业务最终仍然需要把它查出来。
工业场景中的查询常常带有明确的时间范围和设备条件,例如查看某台设备过去一天的温度变化,或者比较一组电表在特定时段内的负荷曲线。对于这样的请求,数据库需要尽量减少无关数据的访问,而不是在庞大的历史记录中逐条寻找。
普通分区表可以按照时间等规则拆分数据,但有了分区并不代表访问路径已经适合所有时序负载。分区粒度、索引设计、数据分布以及查询条件,都会影响实际执行效率。
根据所提供材料,KES 通过时序超表机制优化数据组织,并给出了与普通分区表的测试对比:
| 测试场景 | 普通分区表耗时 | 时序超表耗时 | 按耗时计算的差异 |
|---|---|---|---|
| 实时插入 | 549 秒 | 404 秒 | 耗时减少约 26.4% |
| 曲线查询 | 4834 毫秒 | 253 毫秒 | 耗时减少约 94.8% |
其中,曲线查询的耗时比约为 19.1∶1。更准确的表达是:在这项测试中,普通分区表的查询耗时约为时序超表的 19.1 倍,而不是所有查询都能获得同样幅度的改善。
这组结果也说明,不同负载从同一种数据组织方式中获得的收益可能差别很大。插入和查询的提升幅度并不一致,评估时应分别观察,而不能只选取最显眼的一个数字。
材料没有提供完整的执行计划、索引配置和缓存条件,因此无法进一步确认收益分别来自哪些环节。对于实际应用,更有参考价值的做法,是拿自己的设备分布、时间跨度和典型查询进行验证。
5 -> 把三种能力放到同一套业务负载中考察
压缩、导入和查询优化,分别解决了时序数据生命周期中的不同问题:压缩控制长期保存的空间开销,批量导入缩短历史数据准备时间,面向时序的数据组织则改善后续访问效率。
它们也并非完全独立。更高的压缩程度可能改变读写时的计算开销,更大的导入并发可能与在线查询争用资源,适合短时间窗口的数据组织方式,也未必适合跨年度的大范围统计。
因此,判断一套时序数据库是否适合业务,不能只看最高压缩比或最快写入速度。更重要的是,在持续采集、历史保存和查询分析同时存在的条件下,系统能否保持可预期的表现。
KES 提供的这些测试结果展示了其在特定时序场景下的优化效果。真正落到项目中,还需要结合数据分布、查询方式和部署配置,确认这些收益能否转化为实际的容量节省、更短的数据准备时间,以及稳定的业务响应。
感谢各位大佬支持!!!
互三啦