TPC-H SF300 在树莓派上运行
TL;DR:DuckDB 可以在树莓派板上运行所有 TPC-H SF300 查询。
更新(2025 年 4 月):本文描述的设置现在可以使用最新稳定版 DuckDB v1.2.2 运行 SF1,000 数据集上的所有 TPC-H 查询!
介绍
树莓派是一项旨在提供经济实惠且易于编程的微型计算机板的倡议。2012 年的初始模型配备单核 0.7 GHz CPU、256 MB RAM 和一个 SD 卡插槽,使其成为一个出色的教育平台。随着时间的推移,树莓派基金会推出了越来越强大的型号。最新型号 树莓派 5 拥有 2.4 GHz 四核 CPU,并且——通过额外的连接器——甚至可以使用 NVMe SSD 进行存储。
上周,树莓派 5 获得了另一次升级:现在可以购买配备 16 GB RAM 的版本。DuckDB 团队喜欢在不寻常的设置中试验 DuckDB,例如将智能手机浸入干冰中,因此我们渴望获得一台新的树莓派 5。毕竟,根据 2024 年 12 月 Steam 调查报告,16 GB 内存相当于中位数游戏机中的内存量。那么,树莓派肯定能处理几十 GB 的数据,对吗?我们着手找出答案。
您有很酷的 DuckDB 设置吗?我们很乐意听听您的经验!请在社交媒体上发布或通过电子邮件发送至 [email protected]。
设置
我们的设置由以下组件组成,总价为 300 美元:
组件 | 价格 (美元) |
---|---|
带 16 GB RAM 的树莓派 5 | 120.00 |
树莓派 27 W USB-C 电源 | 13.60 |
树莓派 microSD 卡 (128 GB) | 33.40 |
三星 980 NVMe SSD (1 TB) | 84.00 |
Argon ONE V3 机箱 | 49.00 |
总计 | $300.00 |
我们安装了散热片,将 SSD 安装到位,并组装了机箱。这是我们机器的照片:

实验
那么这个小盒子能做什么呢?我们使用了 TPC-H 工作负载来找出答案。
我们首先将树莓派 OS(Debian Linux 的一个分支)更新到最新版本,即 2024-11-19。然后,我们使用树莓派构建说明编译了 DuckDB 版本 0024e5d4be
。为了使查询易于运行,我们还在构建中包含了 TPC-H 扩展:
GEN=ninja CORE_EXTENSIONS="tpch" make
然后我们下载了包含不同比例因子(SF)TPC-H 数据集的 DuckDB 数据库文件:
wget https://blobs.duckdb.org/data/tpch-sf100.db
wget https://blobs.duckdb.org/data/tpch-sf300.db
我们对这两种比例因子使用了两种不同的存储选项。第一次运行时,我们将数据库文件存储在 microSD 卡上,这是大多数树莓派设置都具备的存储。这张卡在服务操作系统和程序方面表现良好,也可以存储 DuckDB 数据库,但速度相当慢,特别是对于写入密集型操作,其中就包括溢出到磁盘。因此,第二次运行时,我们将数据库文件放在 1 TB NVMe SSD 硬盘上。
对于测量,我们使用了 tpch-queries.sql
脚本,该脚本对所有 TPC-H 查询(从 Q1 到 Q22)执行冷运行。
tpch-queries.sql
PRAGMA version;
SET enable_progress_bar = false;
LOAD tpch;
.timer on
PRAGMA tpch(1);
PRAGMA tpch(2);
PRAGMA tpch(3);
PRAGMA tpch(4);
PRAGMA tpch(5);
PRAGMA tpch(6);
PRAGMA tpch(7);
PRAGMA tpch(8);
PRAGMA tpch(9);
PRAGMA tpch(10);
PRAGMA tpch(11);
PRAGMA tpch(12);
PRAGMA tpch(13);
PRAGMA tpch(14);
PRAGMA tpch(15);
PRAGMA tpch(16);
PRAGMA tpch(17);
PRAGMA tpch(18);
PRAGMA tpch(19);
PRAGMA tpch(20);
PRAGMA tpch(21);
PRAGMA tpch(22);
我们按如下方式运行了脚本:
duckdb tpch-sf${SF}.db -f tpch-queries.sql
我们没有遇到任何崩溃、错误或不正确的结果。下表包含聚合运行时间:
比例因子 | 存储 | 几何平均运行时间 | 总运行时间 |
---|---|---|---|
SF100 | microSD 卡 | 23.8 秒 | 769.9 秒 |
SF100 | NVMe SSD | 11.7 秒 | 372.3 秒 |
SF300 | microSD 卡 | 171.9 秒 | 4,866.5 秒 |
SF300 | NVMe SSD | 55.2 秒 | 1,561.8 秒 |
聚合运行时间
对于 SF100 数据集,使用 microSD 卡时的几何平均运行时间为 23.8 秒,使用 NVMe 磁盘时为 11.7 秒。后者与我们使用 三星 S24 Ultra 获得的 7.5 秒相差不远,而 S24 Ultra 拥有 8 个 CPU 内核,其中大部分运行频率高于树莓派的内核。
对于 SF300 数据集,由于系统内存有限,DuckDB 不得不更多地溢出到磁盘。这导致使用 microSD 卡设置时查询相对较慢,几何平均值为 171.9 秒。然而,切换到 NVMe 磁盘带来了 3 倍的改进,将几何平均值降低到 55.2 秒。
单个查询运行时间
如果您对单个查询运行时间感兴趣,可以在下面找到它们。
查询运行时间(秒)
查询 | SF100 / microSD | SF100 / NVMe | SF300 / microSD | SF300 / NVMe |
---|---|---|---|---|
Q1 | 81.1 | 15.6 | 242.0 | 55.1 |
Q2 | 7.9 | 2.4 | 27.8 | 7.9 |
Q3 | 31.5 | 11.8 | 218.9 | 52.7 |
Q4 | 40.2 | 11.4 | 157.5 | 40.9 |
Q5 | 32.2 | 12.3 | 215.9 | 54.1 |
Q6 | 1.6 | 1.4 | 155.9 | 32.7 |
Q7 | 12.1 | 12.3 | 255.2 | 69.6 |
Q8 | 25.0 | 19.2 | 298.0 | 77.8 |
Q9 | 74.0 | 50.1 | 337.2 | 147.7 |
Q10 | 54.7 | 24.3 | 234.9 | 82.6 |
Q11 | 7.8 | 2.3 | 34.0 | 14.9 |
Q12 | 43.1 | 13.6 | 202.9 | 50.5 |
Q13 | 59.2 | 51.7 | 207.4 | 177.2 |
Q14 | 33.0 | 9.7 | 269.7 | 59.0 |
Q15 | 11.1 | 7.1 | 157.2 | 39.6 |
Q16 | 8.7 | 8.7 | 33.4 | 27.1 |
Q17 | 8.3 | 7.6 | 249.4 | 66.2 |
Q18 | 73.9 | 40.9 | 374.7 | 177.1 |
Q19 | 66.0 | 17.8 | 317.9 | 73.8 |
Q20 | 22.4 | 8.4 | 273.1 | 56.0 |
Q21 | 66.9 | 35.2 | 569.5 | 172.5 |
Q22 | 9.2 | 8.4 | 34.1 | 26.7 |
几何平均 | 23.8 | 11.7 | 171.9 | 55.2 |
总计 | 769.9 | 372.3 | 4,866.5 | 1,561.8 |
展望
为了将我们的结果置于更广阔的背景中,我们查看了 历史 TPC-H 结果,发现 20 年前的一些企业解决方案具有相似的查询性能,它们的查询运行时间几何平均值通常超过 60 秒。当时,这些系统——计入软件许可和维护成本——定价约为 30 万美元!这意味着——如果你忽略维护方面——过去 20 年来,TPC 读取查询的“性价比”(又称价格-性能比)提升了约 1,000 倍。这充分展示了硬件和软件的持续创新在现代系统中所能实现的能力。
免责声明:此处显示的结果并非官方 TPC-H 结果,且仅包含 TPC-H 的读取查询。
总结
我们展示了您可以在成本为 300 美元的树莓派设置中使用 DuckDB,并在不到 30 分钟内运行 TPC-H SF300 数据集上的所有查询。
希望您喜欢这篇博客文章。如果您有有趣的 DuckDB 设置,别忘了与我们分享!