- 安装
- 文档
- 入门
- 连接
- 数据导入
- 概览
- 数据源
- CSV 文件
- JSON 文件
- 多个文件
- Parquet 文件
- 分区
- Appender(追加器)
- INSERT 语句
- 客户端 API
- 概览
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE(分析)
- ALTER TABLE(修改表)
- ALTER VIEW(修改视图)
- ATTACH 和 DETACH
- CALL(调用)
- CHECKPOINT(检查点)
- COMMENT ON(注释)
- COPY(复制)
- CREATE INDEX(创建索引)
- CREATE MACRO(创建宏)
- CREATE SCHEMA(创建模式)
- CREATE SECRET(创建密钥)
- CREATE SEQUENCE(创建序列)
- CREATE TABLE(创建表)
- CREATE VIEW(创建视图)
- CREATE TYPE(创建类型)
- DELETE(删除)
- DESCRIBE(描述)
- DROP(删除)
- EXPORT 和 IMPORT DATABASE
- INSERT(插入)
- LOAD / INSTALL(加载/安装)
- PIVOT(透视)
- 性能分析
- SELECT(选择)
- SET / RESET(设置/重置)
- SET VARIABLE(设置变量)
- SUMMARIZE(汇总)
- 事务管理
- UNPIVOT(逆透视)
- UPDATE(更新)
- USE(使用)
- VACUUM(清理)
- 查询语法
- SELECT(选择)
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE(抽样)
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- 为什么选择 DuckDB
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
本页简要介绍了 DuckDB 引擎的内部结构。
解析器
解析器将查询字符串转换为以下标记:
解析器不了解目录或数据库的任何其他方面。如果表不存在,它不会抛出错误,并且尚未解析任何列的类型。它只将查询字符串转换为一组指定的标记。
ParsedExpression
ParsedExpression 代表 SQL 语句中的一个表达式。例如,它可以是对列的引用、加法运算符或常量值。ParsedExpression 的类型指示它所代表的内容,例如,比较操作表示为 ComparisonExpression
。
ParsedExpressions 没有类型,除了具有显式类型的节点(例如 CAST
语句)。表达式的类型是在绑定器中解析的,而不是在解析器中。
TableRef
TableRef 代表任何表源。这可以是基本表的引用,也可以是连接、表生成函数或子查询。
QueryNode
QueryNode 代表 (1) 一个 SELECT
语句,或者 (2) 一个集合操作(即 UNION
、INTERSECT
或 DIFFERENCE
)。
SQL 语句
SQLStatement 代表一个完整的 SQL 语句。SQL 语句的类型表示它是哪种语句(例如,StatementType::SELECT
代表一个 SELECT
语句)。如果原始查询字符串包含多个查询,则单个 SQL 字符串可以转换为多个 SQL 语句。
绑定器
绑定器将所有节点转换为它们的绑定等价物。在绑定阶段:
- 使用目录解析表和列
- 解析类型
- 提取聚合/窗口函数
发生以下转换:
- SQLStatement →
BoundStatement
- QueryNode →
BoundQueryNode
- TableRef →
BoundTableRef
- ParsedExpression →
Expression
逻辑规划器
逻辑规划器从绑定语句创建 LogicalOperator
节点。在此阶段,创建实际的逻辑查询树。
优化器
逻辑规划器创建逻辑查询树后,优化器对该查询树运行,以创建优化的查询计划。运行以下查询优化器:
- 表达式重写器:简化表达式,执行常量折叠
- 过滤器下推:将过滤器下推到查询计划中,并根据等价集复制过滤器。还修剪因过滤器静态评估为 false 而保证为空的子树。
- 连接顺序优化器:使用动态规划重新排序连接。具体来说,使用了论文 Dynamic Programming Strikes Back 中的
DPccp
算法。 - 公共子表达式:从投影和过滤器节点中提取公共子表达式,以防止不必要的重复执行。
- IN 子句重写器:将大型静态 IN 子句重写为 MARK 连接或 INNER 连接。
列绑定解析器
列绑定解析器将引用特定表列的逻辑 BoundColumnRefExpression
节点转换为引用执行引擎中传递的 DataChunks 中特定索引的 BoundReferenceExpression
节点。
物理计划生成器
物理计划生成器将生成的逻辑操作符树转换为 PhysicalOperator
树。
执行
在执行阶段,物理操作符被执行以生成查询结果。DuckDB 使用基于推送的向量化模型,其中 DataChunks
通过操作符树推送。有关更多信息,请参阅演讲 DuckDB 中的基于推送的执行。