Traceway团队最近做了一次压测:同一台Hetzner CCX13云服务器,月租16.49美元,跑同一版开源可观测性工具Traceway,只换了底层存储引擎——从SQLite换成DuckDB。

结果是,写入吞吐提升3到15倍,仪表盘能扛住的数据规模上限普遍往后挪了100倍。这是Traceway团队自己发布的压测结果,不是第三方复现,数字给得比较细,但这100倍到底意味着什么、边界在哪里,得拆开看。

写入快3到15倍,15倍这一档背后有一次内存崩溃

三类信号写入速度都有提升,但幅度差得不小。

信号类型SQLite 写入速度DuckDB 写入速度提升倍数
指标61,712 点/秒254,242 点/秒约4倍
Span30,508 条/秒95,737 条/秒约3倍
日志4,877 条/秒75,225 条/秒约15倍
同一硬件,写入吞吐差多少 指标 SQLite 61,712/s DuckDB 254,242/s · 4× Span SQLite 30,508/s DuckDB 95,737/s · 3× 日志 SQLite 4,877/s DuckDB 75,225/s · 15× 同一台$16.49/月服务器,同一版Traceway二进制

日志这15倍不是白来的。Traceway团队最初测DuckDB时,机器在压测中途直接死机。查下来是写入路径没做并发限流,一波密集大批次请求能把内存吃光。

团队后来加了一道摄取限流:并发请求数封顶,超载就返回503和Retry-After,而不是硬扛到崩溃。现在公布的数字都是修完这个漏洞之后重跑的。修复前,DuckDB的Span和日志成绩分别被低估23%和将近一半,原因是崩溃截断了压测的后半段。

这里要小心一个结论:列式存储不是在任何写入场景下都比行式快。SQLite这次没暴露崩溃问题,是因为它写入路径更慢,压力上来早早就报错,不会撑到内存耗尽。DuckDB的优势更像是这套特定写入路径加上限流修复之后的结果,原文也没公开表结构、批次大小和具体版本号,不能直接推广成"列式天生更快"的普遍规律。

读取上限后移100倍,但10亿行这档已经查不动

写入是热身,真正决定要不要换库的是读取。Traceway把"读取上限"定义得很具体:仪表盘能不能在5秒内加载出真实页面,再往上一个数量级,查询就不是变慢,而是直接超时不返回。

信号类型SQLite 读取上限DuckDB 读取上限倍数
指标100万行1亿行100倍
Span10万行1000万行100倍
日志10万行1000万行100倍
三类信号,读取上限都后移100倍 指标 100× 100万行 → 1亿行仍达标 Span 100× 10万行 → 1000万行仍达标 日志 100× 10万行 → 1000万行仍达标 上限定义:三个真实仪表盘接口,响应中位数≤5秒,不超时

这100倍说的是阈值后移,不是所有查询都快100倍。原文没给出具体的延迟分位数,不该把它读成"查询普遍快100倍"。

测试还往上加了一档:把指标表塞到10亿行。DuckDB不到一小时写完,占用磁盘10.8GB,压缩后每个点大约10.8字节,机器全程没崩,健康检查一直能答。但到了这个规模,原本几秒能跑完的查询直接超过60秒——写入撑住了,查询没撑住。10亿行这一档只证明DuckDB能把数据存下来,不代表能在这个规模上继续查得动。

这组读取数字还有两个前提没写进对比里。测试时没有并发写入,读的时候机器很闲。数据保留策略也全程关闭。生产环境里边写边查、定期跑保留清理是常态,这次压测都没覆盖。

对谁有用:小团队可以缓一缓ClickHouse,选型还得补作业

这项测试对两类人有实际用处,但用处不一样。

自托管OpenTelemetry或轻量可观测性平台的小团队,如果数据量在千万行以内、预算有限,这组结果给了一个具体理由:先把SQLite换成DuckDB,把"要不要上ClickHouse"这个决定往后推一推。不用额外起一个容器,也不用多背一套客户端-服务器架构的运维成本。

正在SQLite、DuckDB、ClickHouse之间做后端选型的工程负责人,不能把这次结果当成生产选型的终点。

数据库架构这次测试的结论
SQLite单文件,行式事务写入和读取上限都最低
DuckDB单文件,列式分析单机写入快3到15倍,读取上限后移100倍
ClickHouse客户端-服务器,分布式OLAP本次未直接测试,并发场景优势没有验证

ClickHouse的客户端-服务器架构是为了应对高并发查询和多机扩展,这次测试完全没有触及。报告本身也留了空白:没有公开服务器CPU核数和内存、DuckDB与SQLite的具体版本、索引设计、数据生成方式,也没给出查询语句和重复测试次数,目前也没有第三方复现。选型之前,并发读写测试、和ClickHouse的直接对比,这两项作业还得自己补上。