⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
DuckDB 内部结构概述

本页简要介绍了 DuckDB 引擎的内部结构。

解析器

解析器将查询字符串转换为以下标记:

解析器不了解目录或数据库的任何其他方面。如果表不存在,它不会抛出错误,并且尚未解析任何列的类型。它只将查询字符串转换为一组指定的标记。

ParsedExpression

ParsedExpression 代表 SQL 语句中的一个表达式。例如,它可以是对列的引用、加法运算符或常量值。ParsedExpression 的类型指示它所代表的内容,例如,比较操作表示为 ComparisonExpression

ParsedExpressions 没有类型,除了具有显式类型的节点(例如 CAST 语句)。表达式的类型是在绑定器中解析的,而不是在解析器中。

TableRef

TableRef 代表任何表源。这可以是基本表的引用,也可以是连接、表生成函数或子查询。

QueryNode

QueryNode 代表 (1) 一个 SELECT 语句,或者 (2) 一个集合操作(即 UNIONINTERSECTDIFFERENCE)。

SQL 语句

SQLStatement 代表一个完整的 SQL 语句。SQL 语句的类型表示它是哪种语句(例如,StatementType::SELECT 代表一个 SELECT 语句)。如果原始查询字符串包含多个查询,则单个 SQL 字符串可以转换为多个 SQL 语句。

绑定器

绑定器将所有节点转换为它们的绑定等价物。在绑定阶段:

  • 使用目录解析表和列
  • 解析类型
  • 提取聚合/窗口函数

发生以下转换:

逻辑规划器

逻辑规划器从绑定语句创建 LogicalOperator 节点。在此阶段,创建实际的逻辑查询树。

优化器

逻辑规划器创建逻辑查询树后,优化器对该查询树运行,以创建优化的查询计划。运行以下查询优化器:

  • 表达式重写器:简化表达式,执行常量折叠
  • 过滤器下推:将过滤器下推到查询计划中,并根据等价集复制过滤器。还修剪因过滤器静态评估为 false 而保证为空的子树。
  • 连接顺序优化器:使用动态规划重新排序连接。具体来说,使用了论文 Dynamic Programming Strikes Back 中的 DPccp 算法。
  • 公共子表达式:从投影和过滤器节点中提取公共子表达式,以防止不必要的重复执行。
  • IN 子句重写器:将大型静态 IN 子句重写为 MARK 连接或 INNER 连接。

列绑定解析器

列绑定解析器将引用特定表列的逻辑 BoundColumnRefExpression 节点转换为引用执行引擎中传递的 DataChunks 中特定索引的 BoundReferenceExpression 节点。

物理计划生成器

物理计划生成器将生成的逻辑操作符树转换为 PhysicalOperator 树。

执行

在执行阶段,物理操作符被执行以生成查询结果。DuckDB 使用基于推送的向量化模型,其中 DataChunks 通过操作符树推送。有关更多信息,请参阅演讲 DuckDB 中的基于推送的执行

本节页面