DuckDB 源码阅读之相关链接

Posted September 10, 2024 ‐ 4 min read

最近,在评估引入一个 SQL 执行引擎,以取代分析产品对上游数据库的特性的依赖,这些差异给产品带来了显著的困难:

  1. MySQL 不支持 FullJoin
  2. MySQL 的窗口函数中不支持 range expr preceding and ..., 无法执行如下的SQL:(同期累积值)
     select order_date, sum(amount) as x0, sum(sum(amount)) over (
     order by order_date 
     range between 
       date_diff('day', makeDate( year(order_date)-1, 1, 1), order_date) preceding 
     and 
       date_diff('second', makeDate( year(order_date)-1, month(order_date), day(order_date) ), order_date) preceding
     ) as X1
     from orders
     group by order_date;
    
  3. ClickHouse 对窗口函数的支持极为不标准。

考虑引入 polars 或者 duckdb, 之前会偏向于 polars(主要是个人对C++已经生疏,对Rust的感觉要良好很多),但在对比窗口函数的能力方面 还是要欠缺很多,而 duckdb 在这方面的体验要好很多,所以目前更倾向于选择 duckdb。这样,就很有必要熟悉 duckdb 的源代码。这里收集网上与 duckdb 相关的源代码阅读文档,也给自己立一个flag,在接下里的时间里,重点阅读一下 duckdb 的源代码,顺便补一补 C++ 的功课。

引入一个 SQL 执行引擎的目的:

  1. 屏蔽上游数据源的特性限制。提供更多、且更一致的SQL分析能力。
  2. 基于向量计算、优化的执行机制,提供相比传统 OLTP 更快速的查询能力。
  3. 必要时,可以根据自己的分析需要,进行针对性的优化。例如,常见的小计、合计等功能,使用 SQL 实现时,需要执行多条SQL, 可以开发扩展进行针对性的优化。

DuckDB 源代码剖析 文档收集

  1. 张建:

  2. Focus

  3. franzcheng

  4. 红星闪闪

  5. Others

  6. 官方