为什么 DuckDB 2.0 更快
DuckDB 2.0 将于今年秋季推出,目前已经发布了 alpha 版本!我在自己的笔记本电脑上以及与 S3 进行比较,运行了一些有趣的功能,看看对构建表和数据管道的人来说实际发生了什么变化,而不仅仅是数据库引擎。因为是的,DuckDB 2.0 更快了。但要获得这种速度的提升,你需要理解数据的形状,有时还需要考虑如何建模。本文涵盖了我认为最重要的三个特性,以及我得到的一些数据,加上一些我在提交日志中发现的隐藏亮点。以下每个数字均来自一台机器(M5 笔记本)和我的家庭互联网,这使两个版本的速度都大致相同。在引用它们之前,请自己运行一下 ;) 我们先从最简单和最令人兴奋的之一开始:异步 I/O。 异步 I/O:在 AWS S3 上查询速度更快 这是我最喜欢的,因为你的查询没有任何变化。这里有一个查询,从 S3 读取一个 2.2 GB 的 Parquet 文件(Stack Overflow 投票,2.28 亿行,2268 行组),并按类型计数投票。它读取四列中的一列,约 230 MB。 CREATE SECRET s3 (TYPE s3, PROVIDER credential_chain, REGION 'us-east-1' ); SET enable_external_file_cache = false; -- 这样每次运行都会真正命中 S3 SELECT VoteTypeId, count(*) AS n FROM read_parquet('s3://us-prd-motherduck-open-datasets/stackoverflow/parquet/2023-05/votes.parquet') GROUP BY ALL ORDER BY 1; 同样的查询,同一台笔记本 DuckDB 1.5.5 18.8 s DuckDB 2.0 alpha 7.7 s 快速警告:正如我在引言中所提到的,这个数据是我通过家庭网络到 us-east-1,因此这两个数字都比较慢。如果你从云计算环境运行这项检查,期望会更快。那么这里的黑魔法是什么?这个文件被切割成 2268 个行组,每个行组大约 122,000 行。对于每个行组,DuckDB 下载字节,解码 Parquet,按类型计数投票,并在最后合并部分计数。两种工作:在网络上等待和在 CPU 上处理。在 1.5.5 中,每个 18 个工作者轮流完成这两项工作:下载,等待,解码,下载,等待。一个工作者在等待时其 CPU 空闲,在解码时没有下载在进行,而你永远不会有超过 18 个并行下载。在 2.0 中,一组独立的线程仅负责下载,保持数十个行组在进行中,并将字节停放在缓冲区中。工作者只负责解码,总是有一个行组准备给他们。网络和 CPU 同时忙碌。 异步 I/O SELECT VoteTypeId, count(*) AS n FROM read_parquet('s3://…/votes.parquet') GROUP BY ALL ORDER BY 1; DuckDB 1.5.5 下载、等待、解码、重复 votes.parquet · 2268 行组 · 一列 worker 1 idle wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode done worker 2 idle wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode wait decode done worker 3 ... elapsed 0.0 s 0.2 s 0.4 s 0.6 s 0.8 s 1.0 s 1.2 s DuckDB 2.0 alpha 一个池子提前下载,工作者只进行解码 votes.parquet · 2268 行组 · 一列 dl pool idle fetch done worker 1 idle decode done worker 2 idle decode done worker 3 idle decode done elapsed 0.0 s 0.2 s 0.4 s 0.6 s 0.8 s 1.0 s 1.2 s 一个参数驱动这一切:read_ahead_depth,下载池可以在工作者之前获取多少行组。默认为 -1(自动,依据你的线程数量调整),所以异步 I/O 开箱即用。将其设置为 0,你会回到 1.5 的行为。 S3 读取 1.5.5 2.0 alpha 一个 2.2 GB 的 Parquet 文件,一列 18.8 s 7.7 s 23 个大型 Parquet 文件,13.6 GB,一列 11.8 s 3.9 s 一个 1.7 GB 的普通 CSV 116 s 55 s 30 个小 Parquet 文件,每个大约 1 MB 3.7 s 3.3 s 关于小文件的评论:因为那里每个文件的整体时间没有实质改变。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡