小型数据丢失的十年?使用 DuckDB 回顾
小型数据丢失的十年?
Hannes Mühleisen
发布于 2025-05-19
阅读时间:9 分钟
摘要:我们在一台 2012 年的 MacBook Pro 上对 DuckDB 进行了基准测试,以判断:我们是否在追逐数据分析的分布式架构中浪费了十年?
关于数据实际上并没有那么“大”,以及硬件创新的速度如何超过了有用数据集的增长速度,已经有很多讨论,我们自己也发表了不少看法。我们甚至可能走得更远,预测在不久的将来会出现数据奇点,届时 99% 的有用数据集可以在单个节点上轻松查询。正如最近显示的那样,在 Amazon Redshift 和 Snowflake 中,中位数扫描读取了可处理的 100 MB 数据,而 99.9 分位数读取的数据小于 300 GB。因此,奇点可能比我们想象的更近。
但我们开始想知道,这种发展真正开始于何时?像无处不在的 MacBook Pro 这样的个人电脑,通常被认为只能运行 Chrome,何时变成了如今真正的数据处理强力设备?
让我们把注意力转向 2012 年的 Retina MacBook Pro,许多人(包括我自己)当时因为其华丽的“Retina”显示屏而购买的电脑。销量数百万台。尽管当时我失业了,但我甚至还挥霍了一笔钱升级到了 16 GB 的 RAM。但这款机器还有另一个经常被遗忘的革命性变化:它是第一款内置固态硬盘 (SSD) 和 具有竞争力的 4 核 2.6 GHz “Core i7” CPU 的 MacBook。再次观看发布会很有趣,他们 确实 强调了“全闪存架构”的性能方面。
旁注:MacBook Air 实际上是第一款早在 2008 年就配备(可选)内置 SSD 的 MacBook。但不幸的是,它没有 Pro 的 CPU 强大。
巧合的是,我仍然在 DuckDB Labs 办公室里保留着这台笔记本电脑,目前我的孩子们用它来输入超大字体的名字,或者在他们来的时候在 YouTube 上观看 Bluey。但是,这个老古董还能运行现代的 DuckDB 吗?它的性能与现代 MacBook 相比如何?我们能否早在 2012 年就拥有我们现在看到的数据革命?让我们来 выяснить!
软件
首先,操作系统怎么样?为了使几十年的比较更加公平,我们实际上将 Retina 上的操作系统 降级 到 OS X 10.8.5 “Mountain Lion”,这是 2012 年 7 月笔记本电脑发布后几周发布的操作系统版本。即使 Retina 实际上可以运行 10.15 (Catalina),我们也觉得真正的 2012 年比较也应该使用那个时代的操作系统。对于我们这些有时感到有点老的人来说,下面是用户界面的屏幕截图。
接下来是 DuckDB 本身:在 DuckDB,我们对可移植性和依赖性非常重视——或者更确切地说,是对缺乏依赖性非常重视。这意味着要让 DuckDB 在古老的 Mountain Lion 上运行,几乎不需要做什么:标准的 DuckDB 二进制文件默认情况下是为 OS X 11.0 (Big Sur) 构建的,但简单地更改标志并重新编译就足以让 DuckDB 1.2.2 在 Mountain Lion 上运行。我们本也希望使用 2012 年的编译器来构建 DuckDB,但是,唉,C++ 11 在 2012 年确实 太新 了,以至于编译器无法完全支持。无论如何,二进制文件运行良好,也可以通过解决编译器错误来生成。或者我们可以像其他人所做的那样手工编写汇编代码。
基准测试
但我们对合成 CPU 分数不感兴趣,我们对合成 SQL 分数更感兴趣!为了了解旧机器在执行 严肃的 数据处理时的表现,我们使用了_目前相当疲惫但广为人知的 TPC-H 基准测试_,规模因子为 1000。这意味着两个主要表 lineitem
和 orders
分别包含 60 亿行和 15 亿行。当存储为 DuckDB 数据库时,数据库的大小约为 265 GB。
从 TPC 网站上的审计结果 可以看出,在单个节点上运行此规模因子的基准测试似乎需要花费数十万美元的硬件。
我们对 22 个基准查询中的每一个运行了五次,并取了运行时间的中位数以消除噪声。但是,由于 RAM 的数量(16 GB)远小于数据库的大小(256 GB),因此没有大量输入数据可以缓存在缓冲区管理器中,因此这些实际上不是人们有时称之为的“热”运行。
以下是每个查询的结果,单位为秒:
query | latency
---|---
1 | 142.2
2 | 23.2
3 | 262.7
4 | 167.5
5 | 185.9
6 | 127.7
7 | 278.3
8 | 248.4
9 | 675.0
10 | 1266.1
11 | 33.4
12 | 161.7
13 | 384.7
14 | 215.9
15 | 197.6
16 | 100.7
17 | 243.7
18 | 2076.1
19 | 283.9
20 | 200.1
21 | 1011.9
22 | 57.7
但这些冰冷的数字实际上意味着什么?隐藏的惊喜是,我们实际上 有 数字,这台旧电脑实际上可以使用 DuckDB 完成所有基准查询!如果我们仔细查看时间,我们会发现查询需要一分半钟到半小时不等。对于在那种数据上进行分析查询来说,这些等待时间绝不是不合理的。见鬼,早在 2012 年,您需要等待更长的时间才能让 Hadoop YARN 首先接手您的作业,最终在某个时候向您抛出堆栈跟踪。
2023 年的改进
但是这些结果与现代 MacBook 相比如何?作为比较点,我们使用了一台现代的基于 ARM 的 M3 Max MacBook Pro,恰好也在同一张桌子上。但在这两款 MacBook 之间,代表了超过十年的硬件发展。
仅查看 GeekBench 5 基准测试分数,我们看到在使用所有核心时,原始 CPU 速度大约相差 7 倍,单核速度大约相差 3 倍。当然,RAM 和 SSD 速度也存在很大的差异。有趣的是,显示器尺寸和分辨率几乎没有变化。
以下是并排的结果:
query | latency_old | latency_new | speedup
---|---|---|---
1 | 142.2 | 19.6 | 7.26
2 | 23.2 | 2.0 | 11.60
3 | 262.7 | 21.8 | 12.05
4 | 167.5 | 11.1 | 15.09
5 | 185.9 | 15.5 | 11.99
6 | 127.7 | 6.6 | 19.35
7 | 278.3 | 14.9 | 18.68
8 | 248.4 | 14.5 | 17.13
9 | 675.0 | 33.3 | 20.27
10 | 1266.1 | 23.6 | 53.65
11 | 33.4 | 2.2 | 15.18
12 | 161.7 | 10.1 | 16.01
13 | 384.7 | 24.4 | 15.77
14 | 215.9 | 9.2 | 23.47
15 | 197.6 | 8.2 | 24.10
16 | 100.7 | 4.1 | 24.56
17 | 243.7 | 15.3 | 15.93
18 | 2076.1 | 47.6 | 43.62
19 | 283.9 | 23.1 | 12.29
20 | 200.1 | 10.9 | 18.36
21 | 1011.9 | 47.8 | 21.17
22 | 57.7 | 4.3 | 13.42
我们确实看到了显着的加速,从 7 倍到高达 53 倍。几何平均数 从 218 改进到 12,大约提高了 20 倍。
可重现性
二进制文件、脚本、查询和结果可在 GitHub 上 供检查。我们还提供了 TPC-H SF1000 数据库文件 供下载,因此您无需生成它。但请注意,这是一个大文件。
讨论
我们已经看到,这台十年前的 MacBook Pro Retina 能够完成一个复杂的分析基准测试。一台较新的笔记本电脑能够显着提高这些时间。但绝对加速数字在这里有点毫无意义。差异纯粹是 数量级的,而不是 质量上的。
从用户的角度来看,更重要的是这些查询在合理的时间内完成,而不是花费 10 秒或 100 秒才能完成。我们可以使用这两台笔记本电脑解决几乎相同类型的数据问题,我们只需要愿意等待更长的时间。考虑到 DuckDB 的 核外能力,这尤其如此,如果需要,它可以将查询中间结果溢出到磁盘。
也许更有趣的是,早在 2012 年,拥有像 DuckDB 这样的单节点 SQL 引擎在可管理的时间内针对包含 60 亿行的数据库运行复杂的分析 SQL 查询是完全可行的——而且我们甚至不必这次将其浸入干冰中。
历史充满了“如果”,如果像 DuckDB 这样的东西在 2012 年就存在了呢?主要要素已经存在,矢量化查询处理早在 2005 年就已经被发明了。现在看起来有点愚蠢的转向分布式系统进行数据分析会发生吗?我们的基准数据库的数据集大小非常接近 2024 年分析查询的输入数据量的 99.9% 百分位数。虽然 retina MacBook Pro 在 2012 年是一台高端机器,但到 2014 年,许多其他供应商开始提供带有内置 SSD 存储的笔记本电脑,并且更大容量的内存变得更加普及。
所以,是的,我们真的失去了一个完整的十年。
在本文中
最新文章
Announcing DuckDB 1.3.0
2025-05-21
The DuckDB team
使用 DuckDB
Machine Learning Prototyping with DuckDB and scikit-learn
2025-05-16 Petrica Leuca 所有博客文章
文档
开始 安装 指南 数据导入 客户端 API SQL 简介 为什么选择 DuckDB 常见问题解答
资源
博客 媒体 活动 网店 行为准则 商标使用 RSS 订阅 状态页面
开发
组织
社区
社区扩展 Bluesky LinkedIn X (Twitter) Discord Stack Overflow © 2025 DuckDB Foundation, Amsterdam NL