Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

架构

调试技巧

  1. 善于使用工具

    • gdb
    • valgrind
    • strace
    • perf
  2. 从问题入手
    个人觉得带着问题看代码可以更快速的熟悉代码,毕竟发现问题到解决问题的过程是无法走马观花的,势必会经过分析调试等步骤

    • 没有问题可以创造问题
set print static-members off
set scheduler-locking step

parser

标准SQL支持

扩展SQL支持

parser实现

binder

optimizer

概述

查询优化

表达式优化

子查询优化

join优化

统计信息

查询计划生成

executor

详情查看 DuckDB Internals (2023)1

  1. 执行计划怎么转换为 pipeline 的
  2. pipeline 的具体实现
  3. 如何执行 pipeline
  4. 如何调度,如何设置 dop
  5. operator 的具体表现
  6. 表达式怎么执行

  1. DuckDB Internals (2023)

概述

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

filter

projection

aggregate

join

sort

limit

union

subquery

storage

extension

FAQ

Changelog

The end