Internal of duckdb
duckdb 是一个基于 c++ 的嵌入式数据库,模块化的设计让他在保证高性能的情况下,还具备强大的扩展性。
duckdb 的内部架构主要分为以下几个部分:
这里记录学习 duckdb 内部的一些知识,包括:
install duckdb from source
duckdb 使用 CMake 构建,也提供一个 make 文件, 下载之后直接 make 即可
git@github.com:duckdb/duckdb.git
make debug BUILD_TPCH=1 GEN=ninja
架构
调试技巧
-
善于使用工具
- gdb
- valgrind
- strace
- perf
-
从问题入手
个人觉得带着问题看代码可以更快速的熟悉代码,毕竟发现问题到解决问题的过程是无法走马观花的,势必会经过分析调试等步骤- 没有问题可以创造问题
set print static-members off
set scheduler-locking step
parser
标准SQL支持
扩展SQL支持
parser实现
binder
optimizer
概述
查询优化
表达式优化
子查询优化
join优化
统计信息
查询计划生成
executor
详情查看 DuckDB Internals (2023)1
- 执行计划怎么转换为 pipeline 的
- pipeline 的具体实现
- 如何执行 pipeline
- 如何调度,如何设置 dop
- operator 的具体表现
- 表达式怎么执行
概述
pipeline
vectorized execution
查询执行
scan
duckdb 支持多种scan 类型,
// -----------------------------
// Scans
// -----------------------------
TABLE_SCAN,
DUMMY_SCAN,
COLUMN_DATA_SCAN,
CHUNK_SCAN,
RECURSIVE_CTE_SCAN,
RECURSIVE_RECURRING_CTE_SCAN,
CTE_SCAN,
DELIM_SCAN,
EXPRESSION_SCAN,
POSITIONAL_SCAN,
execution/operator/scan/physical_column_data_scan.hpp
execution/operator/scan/physical_dummy_scan.hpp
execution/operator/scan/physical_empty_result.hpp
execution/operator/scan/physical_expression_scan.hpp
execution/operator/scan/physical_positional_scan.hpp
execution/operator/scan/physical_table_scan.hpp