Hotdry.

Article

CedarDB 集成 FSST 轻量级字符串压缩的工程实践

深入剖析 CedarDB 如何将 FSST 轻量级字符串压缩算法集成到列式存储引擎中,实现实时查询场景下的吞吐量优化与存储空间节省。

2026-02-01database-systems

现代分析型数据库在处理海量数据时,字符串列往往是存储空间膨胀和查询性能下降的主要根源。传统块压缩算法(如 LZ4、Zstd)虽然压缩率高,但在需要随机访问单个字符串值的场景下,必须解压整个数据块才能获取目标数据,这对面向实时分析的查询引擎造成了显著的 CPU 开销。CedarDB 作为一款从学术研究项目 Umbra 演进的现代分析型数据库,在设计之初便将轻量级压缩作为存储引擎的核心竞争力之一。FSST(Fast Static Symbol Table)作为专为数据库场景设计的字符串压缩算法,因其支持高效随机访问的特性,成为 CedarDB 优化字符串列存储的理想选择。

FSST 算法特性与数据库场景适配

FSST 由 CWI 荷兰阿姆斯特丹信息研究中心与慕尼黑工业大学的 Peter Boncz、Thomas Neumann、Viktor Leis 等研究人员于 2020 年提出,其设计目标正是解决传统压缩算法在数据库随机访问场景下的局限性。与传统块压缩算法不同,FSST 通过构建一个由短子串组成的符号表(Symbol Table),将每个字符串编码为符号代码的序列,而非字节流。这种设计使得解码器可以独立还原任意位置的字符串值,无需扫描和解压前后无关的数据块。在实际性能测试中,FSST 的解码速度可达 1 至 3 GB/s,压缩率在多数真实数据集上可达原始数据的 2 至 3 倍,这一特性使其非常适合需要频繁随机访问字符串列的分析型工作负载。

FSST 符号表的构建过程采用迭代生成算法,每一代都会根据当前符号表的压缩结果统计符号的使用频率和有效增益(长度乘以频率),保留收益最高的符号进入下一代。算法默认执行 5 代迭代,在符号表大小(255 个符号上限)与压缩质量之间取得平衡。每个符号被限制在 1 至 8 字节范围内,以确保能够装入 CPU 的 64 位寄存器,这对于后续的向量化解压实现至关重要。当某个子串无法匹配符号表中的现有符号时,编码器会使用特殊的转义码(0xFF)标记该字节,这确保了 FSST 能够无损压缩任意字符串数据,同时也意味着在极端情况下(如完全随机的字符串)压缩率可能接近或低于 1:1。

CedarDB 存储引擎的集成架构考量

CedarDB 源自慕尼黑工业大学的 Umbra 研究项目,其存储引擎从零开始设计以充分利用现代硬件特性,包括多核 CPU 和高速 SSD 存储。在集成 FSST 时,CedarDB 团队面临的工程挑战主要集中在三个层面:符号表的生命周期管理、压缩粒度的选择以及查询执行路径的适配。

首先是符号表的管理策略。在列式存储架构中,每个字符串列的压缩单元通常是一个数据块或向量化批次。CedarDB 需要为每个压缩单元单独训练或复用符号表,这涉及存储开销与压缩质量之间的权衡。如果为每个小数据块单独训练符号表,虽然可能获得更好的压缩率,但符号表本身(通常几百字节)的存储开销会抵消压缩收益;如果使用全局共享的符号表,则可能无法适应不同数据分区的分布差异。工程实践中,一种常见策略是在数据写入时使用采样(通常为 16KB 均匀采样数据)快速训练符号表,而在查询优化阶段根据统计信息动态选择是否启用 FSST 压缩。

其次是压缩粒度与查询执行的协同。分析型数据库的查询执行通常采用向量化模型,一次性处理数千行数据以提高 CPU 缓存命中率。CedarDB 的代码生成引擎会在运行时为每个查询生成定制化的机器码,尽可能将数据保持在 CPU 寄存器中以减少内存访问。当 FSST 压缩应用于字符串列时,解码过程必须与这种向量化执行模型紧密集成,以避免频繁的函数调用开销。具体而言,CedarDB 可能会为 FSST 解码实现 SIMD 向量化指令(如 AVX-512),在单个指令周期内并行处理多个符号的解码,这与 FSST 论文中提到的 "Meatgrinder" 优化思路一致。

第三是与现有压缩方案的协同工作。列式存储通常会结合多种压缩技术:字典编码用于低基数的分类变量,位图索引用于选择性过滤,而 FSST 则填补了字符串压缩的空白。在 CedarDB 的压缩栈中,FSST 可能与字典编码形成互补或级联关系 —— 对于高基数字符串列(如 URL、JSON 片段、自由文本),FSST 能捕捉子字符串级别的重复模式;对于低基数列,字典编码仍是更优选择。查询执行器在扫描数据时需要透明地处理这种多层压缩结构,在需要时即时解压所需数据。

性能提升与落地参数建议

将 FSST 集成到 CedarDB 存储引擎后,预期带来的性能收益主要体现在存储空间节省和查询吞吐量提升两个维度。根据 FSST 论文的实验数据以及类似系统(如 Vortex)的实践经验,在典型分析型工作负载下,字符串列的存储空间可减少 50% 至 70%,查询的端到端延迟可降低 20% 至 40%,具体效果取决于数据分布和查询模式。

对于希望在生产环境中启用或调优 FSST 压缩的 CedarDB 用户,以下参数和策略可作为参考起点。符号表生成方面,默认的 5 代迭代和 255 符号上限在大多数场景下表现良好,但如果数据集的字符串模式高度重复且子串长度普遍较长(如基因序列、日志消息模板),可以尝试将符号上限提升至 255(最大有效值)以获得更高压缩率。采样大小通常无需调整,FSST 论文建议的 16KB 采样能够在代表性和训练速度之间取得平衡。在压缩开关控制上,建议仅对平均字符串长度超过 8 字节、基数超过总行数 10% 的列启用 FSST 压缩,以避免短字符串或低基数列的负收益。

监控层面,建议跟踪以下指标以评估 FS 集成的实际效果:压缩率(压缩后大小与原始大小之比)、解压吞吐量(MB/s)、字符串列扫描占总查询时间的比例,以及 CPU 利用率的变化趋势。如果发现解压吞吐量低于预期(如低于 500 MB/s),可能需要检查是否因符号表命中率过低导致大量转义字节出现,此时应考虑重新采样训练或调整数据分区策略。

CedarDB 对 PostgreSQL 协议的兼容意味着用户可以直接通过 psql 或常用 BI 工具连接数据库并进行上述监控和分析,无需额外的客户端适配。这种低门槛的集成方式是 CedarDB 在企业推广中的重要优势,也是其能够快速获得用户认可的关键因素之一。

资料来源:CedarDB 官方博客(https://cedardb.com/blog/),FSST 算法原始论文(VLDB 2020)。

database-systems