原文地址:https://duckdb.org/2026/01/23/duckdb-vortex-extension

标题: “在 DuckDB 中宣布支持 Vortex”
作者: “Guillermo Sanchez, SpiralDB 团队”
摘要: “Vortex 是一种新的列式文件格式,设计前景非常广阔。SpiralDB 和 DuckDB Labs 已携手合作,为您在读取和写入 Vortex 文件时提供极快的体验!”


我认为值得在开头先简单谈谈已确立的列式数据格式。Parquet 为分析领域做出了许多惊人的贡献。如果您回顾 CSV 曾是更好选择的年代,就会知道 Parquet 有多么重要。然而,即使规范随着时间的推移不断演进,Parquet 也存在一些设计上的限制。一个特别的限制是,它采用块压缩,引擎需要解压页面才能进行后续操作,如过滤、解码值等。一段时间以来,研究人员和私营公司一直在研究 Parquet 的替代方案,以期改进 Parquet 的一些缺点。来自 SpiralDB 团队的 Vortex 就是其中之一。

什么是 Vortex?

Vortex 是一种可扩展、开源的列式数据格式。它旨在处理异构计算模式和不同的数据模态。但是,这具体意味着什么呢?

该项目于 2025 年 8 月由 SpiralDB 团队捐赠给 Linux 基金会。

Vortex 为不同的数据类型提供了不同的布局和编码。其中一些最引人注目的包括用于浮点数编码的 ALP 和用于字符串编码的 FSST。这种轻量级压缩策略在保持数据体积小的同时,实现了 Vortex 最重要的特性之一:计算函数。通过了解数据的编码布局,Vortex 能够对压缩数据运行任意表达式。这使得 Vortex 阅读器能够在不解压数据的情况下,在存储段内执行过滤表达式等操作。

我们提到异构计算是为了强调 Vortex 的设计理念是为不同数据类型(包括向量、大段文本,甚至图像或音频)提供优化的布局,同时最大化 CPU 或 GPU 的利用率。其理念是将解压缩延迟到 GPU 或 CPU,从而实现 Vortex 所称的“延迟物化”。FastLanes 编码(一个起源于 CWI 的项目,与 DuckDB 同源)是实现此功能的主要驱动力之一。

Vortex 还支持动态加载库(类似于 DuckDB 扩展),以提供针对特定类型的新编码以及特定的计算函数,例如用于地理空间数据。另一个非常有趣的功能是将 WebAssembly 编码到文件中,这使得阅读器能够受益于应用于文件的特定计算内核。

除了 DuckDB 之外,DataFusion、Spark 和 Arrow 等其他引擎也已提供与 Vortex 的集成。

更多信息,请查看 Vortex 文档

DuckDB Vortex 扩展

正如其名,DuckDB 是一个数据库,是的,但它也被广泛用作查询多种不同数据源的引擎。通过核心或社区扩展,DuckDB 可以与以下系统集成:

  • 数据库,如 Snowflake、BigQuery 或 PostgreSQL。
  • 湖仓格式,如 Delta、Iceberg 或 DuckLake。
  • 文件格式,最著名的是 JSON、CSV、Parquet,以及最近的 Vortex。

社区已经变得非常有创造力,所以现在您甚至可以使用 社区扩展 通过 DuckDB 读取 YAML 和 Markdown。

这一切都归功于 DuckDB 的扩展系统,它使得实现与不同文件格式或外部系统交互的逻辑相对容易。

SpiralDB 团队构建了一个 DuckDB 扩展。与 DuckDB Labs 团队一起,我们已将该扩展作为 DuckDB 核心扩展 提供,让社区可以在 DuckDB 中享受 Vortex 作为一等公民的待遇。

使用示例

安装和使用 Vortex 扩展非常简单:

INSTALL vortex;
LOAD vortex;

然后,您可以轻松地使用它来读写,类似于 Parquet 等其他扩展。

SELECT * FROM read_vortex('my.vortex');

COPY (SELECT * FROM generate_series(0, 3) t(i))
TO 'my.vortex' (FORMAT vortex);

为什么选择 Vortex 和 DuckDB?

Vortex 声称主要在三个用例中表现出色:

  • 传统的 SQL 分析:通过延迟解压缩和对压缩数据执行计算表达式,Vortex 可以在存储段内过滤数据,减少 I/O 和内存消耗。
  • 机器学习预处理管道:通过支持多种不同数据类型的编码,Vortex 声称能够高效地读写数据,无论是音频、文本、图像还是向量。
  • AI 模型训练:FastLanes 等编码允许非常高效地将数据复制到 GPU。Vortex 旨在能够将数据直接从 S3 对象存储复制到 GPU。

通过延迟解压缩实现更高效的 I/O 和内存使用的承诺,是尝试将 DuckDB 与 Vortex 结合用于 SQL 分析的一个充分理由。另一方面,如果您希望在用于多个用例(包括预处理管道和 AI 训练)的统一数据集上运行分析,那么 Vortex 可能是一个不错的选择,因为它旨在很好地适应所有这些用例。

性能实验

对于那些渴望看到数据的人,我们决定使用 DuckDB 运行 TPC-H 基准测试,比例因子为 100,以了解 Vortex 作为存储格式与 Parquet 相比的表现。我们尽力使基准测试尽可能公平。以下是参数:

  • 在 Mac M1(10 核,32 GB 内存)上运行。
  • 基准测试对每个查询运行 5 次,并使用平均值进行最终报告。
  • 每个查询运行后关闭 DuckDB 连接,试图使运行“更冷”,避免 DuckDB 的缓存(特别是 Parquet)影响结果。操作系统的页面缓存确实对后续运行有影响,但我们决定承认这个因素,并且仍然保留第一次运行。
  • 每个 TPC-H 表是单个文件,这意味着 Parquet 和 Vortex 的 lineitem 文件都相当大(都约 20 GB)。这使我们能够忽略通配符和许多小文件的影响。
  • 用于基准测试的数据文件使用 tpchgen-rs 生成,并使用 DuckDB 的 Parquet 和 Vortex 扩展复制出来。
  • 我们将 Vortex 与 Parquet v1 和 v2 进行比较。v2 规范允许比 v1 规范快得多的读取速度,但许多写入器不支持 v2,因此我们认为同时包含两者是值得的。

结果非常好。 与 Parquet V2 相比,TPC-H 基准测试运行速度快了 18%;与 Parquet V1 相比,快 35%(使用推荐的几何平均值计算)。

另一个有趣的结果是各次运行之间的标准偏差。Parquet 的每次查询的第一次(也是最冷的)运行与后续运行之间存在相当大的差异,而 Vortex 在所有运行中都表现良好,标准偏差小得多。

在这里插入图片描述

格式 几何平均值 (秒) 算术平均值 (秒) 平均标准偏差 (秒) 总时间 (秒)
parquet_v1 2.324712 2.875722 0.145914 63.265881
parquet_v2 1.839171 2.288013 0.182962 50.336281
vortex 1.507675 1.991289 0.078893 43.808349

不同基准测试运行的时间确实存在差异,后续运行也产生了类似结果,但略有变化。Parquet v2 和 Vortex 之间的差异始终在几何平均值上约为 12-18%,在总时间上约为 8-14%。基准测试非常困难!

点击此处查看基准测试结果的更详细分解。

此图显示了每个查询的结果,包括标准偏差误差线。
在这里插入图片描述

以下是数据集大小的总结。请注意,Parquet v1 和 v2 都使用了 DuckDB Parquet 写入器使用的默认压缩方式,即 Snappy。在这种情况下,Vortex 没有使用任何通用压缩,但数据大小仍然具有竞争力。

parquet_v1 parquet_v2 vortex
customer 1.15 0.99 1.06
lineitem 21.15 16.02 18.14
nation 0.00 0.00 0.00
orders 6.02 4.54 5.03
part 0.59 0.47 0.54
partsupp 4.07 3.33 3.72
region 0.00 0.00 0.00
supplier 0.07 0.06 0.07
总计 33.06 25.40 28.57

结论

Vortex 是 Parquet 等成熟列式格式的一个非常有趣的替代方案。它专注于轻量级压缩编码、延迟解压缩以及能够在压缩数据上运行计算表达式,这使其适用于广泛的用例。就 DuckDB 而言,我们看到 Vortex 对于分析查询已经非常高效,在 TPC-H 基准测试查询中与 Parquet v2 相当或更好。

Vortex 自 6 个多月前发布的 0.36.0 版本以来一直保持向后兼容。Vortex 目前版本为 0.56.0。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐