esProc SPL 和 DuckDB 存储对比

数据存储本质上是在灵活性、性能、易用性之间找平衡。DuckDB 和 esProc SPL 都提供自有的二进制存储形式,但在数据组织上有很大不同。

DuckDB 仍然是常规数据库机制,数据组织在逻辑上是整体化的,某个主题下的数据形成一个数据库,有一套元数据来描述库内数据的结构及关系。一个数据库在逻辑上是一个整体,数据有着明确的库内和库外的差别,以及明确的入库和出库动作,也就是常说的封闭性。封闭会带来较好的可管理性,但也意味着数据组织的自由度欠缺,虽然 DuckDB 也能同时处理库外数据,不过这属于多数据源功能了,而且很多时候仍然要映射成表。

esProc 完全不一样,它就不是数据库,其数据组织在逻辑上是碎片化的,没有主题的概念,也就没有元数据,当然更没有库内库外之分以及入库和出库的动作。随便什么数据,只要能访问到就能一起参与运算,无非只是不同数据源的访问性能不同。esProc 为高性能设计了专门的二进制数据存储格式(列存、压缩等),但其逻辑地位和某个文本文件或者其它数据库中上取出来的数据并没有区别。esProc 的存储方式有很强的开放性,数据组织也更为灵活自由,但牺牲了数据的整体性和可管理性。

再看看 DuckDB 和 esProc SPL 的二进制格式差异。

DuckDB 的.duckdb 文件采用纯列式存储,所有数据按列分块压缩。列存对统计类查询(如计算总销售额)非常友好,因为只需读取单列数据,且压缩后体积小、读取速度快。

esProc 提供了两种存储格式来应对不同场景:
1. btx 文件(行存二进制):数据按行存储,结构类似 CSV,但以二进制格式保存,读写速度更快。适合小规模数据或临时存储(如中间计算结果),无需预定义结构,即写即用。
2. ctx 文件(列存组表):数据按列存储,且按主键(如时间、ID)有序分块。适合大规模数据分析,可以直接跳过不满足条件的分块,减少 IO 消耗,速度提升显著。ctx 也可以选择行存或不压缩,不同计算场景可以选择。
这种“大小通吃”的设计,让 esProc 在方便和性能之间找到了平衡点:小文件用 btx 省事,大数据用 ctx 高效。

大数据分析时,esProc 的 ctx 除了具备 DuckDB 的列存优势,还特别支持有序计算(相对 SQL 无序),ctx 还可以根据计算来设计,比如按照指定顺序存储就能应用二分法等与顺序相关的算法来提升计算性能,也可以进行冗余,反正就是多份文件的事儿。

esProc 存储的灵活性还表现在允许同字段存储不同数据类型的数据,这会大幅增加灵活性,但会牺牲性能,根据需要取舍。

同时,esProc 字段取值可以是另一条记录或表,因此可以很好支持多层数据存储和使用。现在 DuckDB 对 JSON 类数据支持的也不错,这方面二者不相伯仲。

esProc SPL 与 DuckDB 在数据管理及存储上各具特色。DuckDB 采用传统数据库模式,通过元数据统一管理结构化数据,封闭式机制管理性强但灵活性受限;而 esProc 采用碎片化数据组织,无元数据约束,支持任意来源数据混合运算,但需开发者自主管理数据。存储方面,DuckDB 仅支持纯列存格式,esProc 则提供 btx 行存和 ctx 列存组表双模式,支持同字段多类型及多层嵌套数据,存储策略能按场景灵活选择。