选 DuckDB 而不是 SQLite

查看原文 HN 讨论

文章摘要

这是 Traceway(一个自托管 OpenTelemetry 可观测性后端)作者 Jovan Stojiljkovic 的系列基准测试第三篇。原标题其实更克制——《同一台 16 美元的机器上跑 SQLite 与 DuckDB:每一道悬崖都往后挪了 100 倍》。前两篇他论证了”一台便宜机器就能跑完整的可观测性栈”,并用 SQLite 实测出了若干限制;这一篇把同样的方法论原封不动地跑在 DuckDB 存储引擎上。

硬件是 Hetzner 纽伦堡机房的一台 CCX13(文中标价 16.49 美元/月),同一个 Traceway 二进制,只换底层存储引擎。核心结果:

作者称”读取悬崖”这个词用得贴切,因为再往上一个 10 倍级台阶,查询不是变慢,而是干脆不返回。他专门用把探测超时放宽到 60 秒的方式重跑了整个阶梯,想给失败的格子填上真实耗时,结果是根本填不上:所有失败的查询在 61 秒被切断时都还在跑。这说明悬崖不是斜坡,两个数据库都一样——从几秒直接跳到超过一分钟,典型的聚合超出 4 GB 内存预算后开始溢写的特征。

方法论上作者相当坦白,主动披露了三处与上一篇的差异:负载生成器升级了(原来那台在 DuckDB spans 测试中自己先崩了,而数据库还是 0% 错误率);新增了”消化门”(DuckDB 摄入停止后会做 WAL 检查点,不等它稳定就探测等于在测一台忙碌的引擎);只统计 2xx 确认的行数而非尝试行数。最重要的一条披露在后端而非测试架子上——最初几轮 DuckDB 跑分他自己都不信,追查下去发现是他自己摄入路径的一个真实 bug:没有准入控制,持续的大批次会把进程打爆内存。他加了并发上限并用 503 + Retry-After 应答过载后重跑了全部测试。修复前的旧结果低估了 DuckDB——spans 低 23%,logs 差了近一半。

局限他也列得很清楚:单次跑分(承诺的三次取中位数又欠了一期)、没测写入并发下的读取、没测混合信号负载、没校验结果正确性、全部用默认配置。

结论部分他没有一边倒:只有两种情况他仍会选 SQLite 构建——一是需要一个 Go 能编到哪就跑到哪的二进制(DuckDB 构建需要 CGO 和 glibc,镜像只能是 Debian 而非 Alpine);二是数据量本就远低于上一篇的天花板时,SQLite 所有工作都内联完成、没有延迟检查点和消化窗口,是”能用的最简单方案”。但一旦 logs 重要、或者保留期超过一小时,比较就不再接近了。最后一个星号他也自己打上:这些数字之所以存在,是因为基准测试先找出了他自己代码里的崩溃 bug,”引擎从来不是问题,问题在它前面的代码”。

HN 评论精华

这条讨论的真实走向和文章内容关系不大——两条主线分别是”苹果比橘子”和”这是 AI 写的”,两者都相当尖锐。

第一条主线:这个对比本身不成立。

第二条主线:AI 味太重,读不下去。

第三条主线:DuckDB 的真实短板。