论文笔记:DuckDB: an Embeddable Analytical Database
论文笔记:DuckDB: an Embeddable Analytical Database
DuckDB 是荷兰国家计算科学与数学机构 CWI 的数据库架构组的一些工作人员发起的开源数据库项目。介绍内嵌的分析型数据库 DuckDB,DuckDB 本身也是为进程内嵌入所设计的,它更像是 SQLite 这样的进程内数据库。
Introduction
SQLite 专注于事务,采用行存与 B+ 树存储格式。所以在 AP 领域表现差。
如下图所示,在 OLAP 领域缺少一个嵌入式的数据库管理系统。
需求的主要来源包括:
- 交互式数据分析
- 边缘计算
在从之前开发的 MonetDB 上,开发了 MonetDBLite, 被证明如果不是专门构建的系统,还是有问题很多问题难以解决。
下面列举了几个被认同的嵌入式分析型数据库的需求:
DuckDB 是专门构建的系统。下面将介绍在不同的数据集下,DuckDB 在 cpu load 和 memory pressure 方面与其他系统对比的表现。
Design And Implementation
DuckDB 没有使用革命性的组件,而是将成熟的,适合其场景的技术方法进行组合。作为一个嵌入式的数据库,它没有客户端协议接口,或者服务端进程。而是使用 C++ 语言的 API。除此之外,它还提供了 SQLite 的兼容层,允许之前使用 SQLite 的重新连接到 DuckDB。使用了 pg 的 SQL parser 并做了限制。逻辑执行计划包含了两个部分,binder 和 plan generator。binder 用于处理表达式涉及到的 schema 对象,logical plan generator 用于将 parser tree 转换为 basic logical query operator tree。经过计划阶段,会得到一个一个逻辑执行计划。统计信息也会在这个阶段进行处理。
DuckDB 的优化器采用带有 fallback 的动态规划算法进行 join reorder。会进行子查询打平,还有一些列的 rewrite 规则和表达式化简。基数估计使用的是 HyperLogLog 算法。在经过这一些列的处理之后,得到优化过后的逻辑计划。
physical planner 将逻辑计划通过选择合适的实现转变为物理计划。例如 scan 可能使用索引,而不是基于选择估计进行全表扫描,使用 hash join 或者 merge join。
DuckDB 使用向量化的执行引擎。介绍如下图所示:
DuckDB 还提供了符合 ACID 的 MMVC。为了持久化存储,DuckDB 使用了 read-optimized datablocks storage layout。逻辑表被水平切分,以列分区,使用轻量级的压缩方法存入物理块中。物理块还会为每列存放最大值,最小值的索引,用于查询快速决定是否相关。此外块为每列携带一个轻量级索引,这允许进一步限制扫描的值数量。
Demonstration Scenario
这部分主要讲了,要展示 DuckDB 的两方面优势,在有限的资源的前提下,得益于嵌入式的操作,处理大数据集的能力。
每个仪表盘代表了,不同计算机上运行的不同数据库系统,主要包括: SQLite MonetDBLite, HyPer, DuckDB。使用的数据集是提前加载好的 TPC-H benchmark。
四台计算机使用以太网与第五台计算机相连。这台计算机能够重复发送相同的 query 到其他四台计算机,并实时显示从其他四台计算机接收的 metric。至少有 Qps 和 memory pressure。
主要展示 "teaser" 和 "drilldown" 场景下。
操作方法 :
The audience will be invited to turn the physical dial to increase/decrease the amount of data that is read from the fact tables. This will immediately influence intermediate and result set sizes of the pre-configured query which will also immediately impact the metrics shown on the screen. Figure 2 illustrates this setup.
测试结论:
Current State And Next Steps
DuckDB 能够完成大部分 SQLite 的 SQL logic test suite。下一步是完成 datablocks storage shceme 和 subquery folding。buffer manager 也还没有完成。查询间的并行已经完成,查询内的并行也会添加。我们计划实现 work staling scheduler 来平衡长短查询。也会为 host application 做特别的资源使用平衡的考虑。
更进一步的方向是 self-checking。我们已经知道不信任在运行数据库的硬件。这个是在边缘计算中特别有意义的。一种方法是对于所有持久化数据,中间数据和 piggy-back 在 scan 算子上做校验和验证。这个方法不会有太多性能上的影响。向量化的引擎特别适合这种一块数据,能放进 cpu cache,而不需要额外的内存访问。另一种方法是增加硬件的信任。周期性的 run sanity check。
词汇
first-ever 首次的
even further 进一步
relevant 紧密相关的;切题的 有价值的;有意义的
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)