① 标题党#
主标题:DuckDB 快,是因为它连 CPU 缓存都算好了?
备选A:为什么同样的查询,DuckDB 的缓存命中率更高
备选B(短视频):快,是一种精打细算
② 开场钩子#
你可能觉得数据库快不快看算法、看索引。但 DuckDB 比我见过的库都更在乎一件事:CPU 缓存。数据放不对地方,CPU 再好也白搭。
③ 主角特性:缓存局部性 / 批处理#
- 缓存友好布局:向量化一次处理一个 block,数据在内存里连续相邻 → 命中 CPU 高速缓存(L1/L2),避免频繁访内存。
- 减少随机访问:列存 + 批量处理让”下一个数据”大概率就在”上一个数据”旁边,预取命中率高。
- 分析查询的”顺序扫描 + 聚合”模式,天然吃满缓存局部性。
反常识:有时候不是数据集太大,而是你的查询把 CPU 缓存”打爆”了。DuckDB 尽量让每一次 CPU 循环都干实事。
④ 最小可复现#
-- 数据连续排布,批量 scan
SELECT count(*) FROM t WHERE a > 100;
-- 观察内存带宽 vs 磁盘 IO(列存下大查询基本不吃 IO)sql⑤ 结论#
快,是精打细算出来的。DuckDB 从存储布局到执行方式,每一步都在帮你哄着 CPU 缓存。硬件还是那块硬件,你却感觉它变快了。
⑥ 配图脚本#
缓存层级示意图 / 顺序扫描 vs 随机访问 / 带宽对比 / 结论卡