DuckDB:从研究项目到广泛应用的数据库,为何如此之快?
引言从2019年阿姆斯特丹CWI的一个研究项目起步DuckDB发展成为过去十年中应用最广泛的数据库之一。它应用场景众多包括笔记本、ETL管道、仪表盘、CI测试运行器、SaaS产品内的嵌入式分析甚至能在iPhone上以100的规模因子运行TPC - H。许多公司围绕它开发出了实际产品如MotherDuck将其封装成云数据仓库Hex、Omni和Evidence等将其用作应用内执行引擎和缓存Fivetran在数据湖写入器中使用它进行合并和压缩Rill基于它构建开源BI工具Greybeam也用它处理数百万次查询。什么是DuckDBDuckDB是一个进程内分析型SQL数据库。“分析型”意味着它针对扫描数百万行数据进行过滤、聚合和连接的查询进行了优化而非通过主键查找单条记录的查询“进程内”表示它没有服务器可像加载NumPy或Polars一样作为库加载到程序中。它以单个小于20 MB的二进制文件形式发布无需外部依赖可通过pip install duckdb、brew install duckdb安装或在C项目中链接libduckdb。它能直接打开包含Parquet、CSV或JSON文件的目录将其视为SQL数据库。而且DuckDB还是目前最快的单节点分析引擎之一常能与花费数百万美元的集群相抗衡。查询在进程内运行将DuckDB指向笔记本电脑上一个6 GB的Parquet文件不到一秒就能得到结果无需集群、设置、迁移和CREATE TABLE。大多数分析型数据库是服务器如Snowflake、Postgres、BigQuery和Redshift需打开连接通过TCP发送SQL语句等待结果返回此过程中结果集记录要序列化、反序列化对于大型结果集这项工作耗时可能比查询本身还长。DuckDB是库无守护进程、端口和集群只需加载libduckdb到程序中调用函数即可。2017年Mark Raasveldt和Hannes Mühleisen研究发现客户端协议是查询过程中最慢的一步主要受带宽限制和每个值处理开销影响。DuckDB与客户端处于同一进程避开了这两个瓶颈。当Python脚本针对Pandas数据框执行查询时DuckDB可使用替换扫描功能理想情况下能直接读取Python进程的底层缓冲区实现零复制。以Arrow格式返回结果或查询基于Arrow的数据可避免传统API带来的逐行转换开销。从SQL到逻辑计划解析SQL语句进入DuckDB后第一步是解析为抽象语法树ASTDuckDB使用Postgres解析器的一个分支。AST是查询的树形表示解析过程将扁平字符串转换为引擎能理解的结构化对象。树形结构便于引擎其他部分工作绑定器、优化器和物理规划器都依赖它处理查询。绑定绑定阶段根据目录解析AST中的每个名称进行类型检查输出绑定树暴露未解析列、模糊引用和类型不匹配等错误将原始SQL文本转换为类型化的树。优化器DuckDB的优化器由一系列小型、专注的转换组成可单独检查和禁用。如过滤下推将WHERE谓词靠近扫描操作子查询展开将相关子查询重写为连接操作动态连接 - 过滤下推在哈希连接中利用构建侧数据计算边界推回到探测侧扫描操作连接顺序优化使用动态规划算法选择最优连接顺序。整个优化阶段通常在约一毫秒内完成之后得到逻辑计划。物理计划将逻辑步骤映射到物理操作符优化器输出的逻辑计划说明计算内容但未指定算法。DuckDB遍历逻辑计划根据节点输入形状和谓词选择物理操作符输出物理计划即由执行器知道如何运行的物理操作符组成的树。物理计划会拆分为多个管道。管道管道可想象成装配线数据从一端进入经过一系列站点处理后传递给下一个站点。如WHERE操作、投影操作、哈希连接的探测侧等可构成管道管道能并行执行。管道中断器有些操作符需看到整个输入数据才能产生输出如ORDER BY、GROUP BY、哈希连接的构建侧这些操作符是管道中断器或接收器标志着一个管道的结束和下一个管道的开始。物理计划由接收器连接起来的一系列管道组成。接收器中的操作接收器的操作分为接收、合并和最终处理三个阶段。接收阶段每个线程接收数据块并写入本地状态合并阶段将各线程本地状态合并到全局状态最终处理阶段合并后的全局状态作为下一个管道的输入。并行性是局部的管道和接收器通过为线程分配数据块和本地状态实现并行运行DuckDB一次只对一个管道进行并行处理这是分块驱动的并行处理和向量化执行能有效工作的原因之一。存储层DuckDB数据库DuckDB数据库是单一文件通常扩展名为.duckdb或.db数据分割成固定大小的块文件头包含元数据每个块带有校验和用于检测数据是否损坏。列、行组和区域映射块内部各列分开存储列存储在分析查询中更具优势。每列分割成行组行组是并行处理的基本单位。每个行组带有区域映射包含最小值、最大值和空值计数可用于跳过不满足谓词的数据。区域映射的有效性取决于列的排序方式。Parquet用户常将DuckDB指向Parquet文件进行查询。Parquet是列存的按列和行组存储最小/最大统计信息DuckDB可利用这些信息确定满足查询谓词的行组只读取所需列块。若文件在远程位置DuckDB可按需获取字节合理的WHERE子句可提高网络性能。CSVCSV文件无自我描述性DuckDB通过CSV嗅探器确定列的分隔符、值是否加引号、引号如何转义、第一行是否包含列名以及每列的类型。嗅探器包括方言检测、列类型检测和标题行检测基于采样数据工作可调整采样大小。执行查询运行前需进行大量工作包括解析、绑定、优化和编译成物理计划存储层也会提前做很多工作。第2部分将从执行阶段开始介绍。

相关新闻

Adobe-GenP技术深度解析:通用补丁机制与批量激活实现原理

Adobe-GenP技术深度解析:通用补丁机制与批量激活实现原理

Adobe-GenP技术深度解析:通用补丁机制与批量激活实现原理 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款基于AutoIt脚本语言开发的Ado…

2026/6/20 13:03:56阅读更多 →
简单理解:为什么SVPWM没看到提反Clarke变换

简单理解:为什么SVPWM没看到提反Clarke变换

因为 SVPWM 和 SPWM 计算思路完全不同!用拼积木比喻理解SVPWM(空间矢量 PWM):直接拼出目标有 6 组基础电压矢量:U1 (100)、U2 (110)、U3 (010)、U4 (011)、U5 (001)、U6 (101)。 想要指定方向、幅值的电压矢量&#xf…

2026/6/20 12:58:56阅读更多 →
嵌入式GUI开发实战:emWin LISTVIEW控件从入门到精通

嵌入式GUI开发实战:emWin LISTVIEW控件从入门到精通

1. 项目概述:为什么嵌入式GUI离不开LISTVIEW控件?在嵌入式系统的人机交互界面开发中,我们经常需要展示结构化的数据,比如设备参数列表、文件目录、通讯日志或者传感器历史记录。面对这种多行多列、需要滚动查看甚至排序筛选的需求…

2026/6/20 12:58:56阅读更多 →
【呼伦贝尔草原牧区】远距离草原巡护对讲通信解决方案

【呼伦贝尔草原牧区】远距离草原巡护对讲通信解决方案

一、本地核心痛点呼伦贝尔草原地域辽阔,全域草场绵延数千公里,牧区巡护、草原防火、畜牧巡查、边境值守作业范围极度分散,是内蒙古东部通信保障难度极高的区域之一。当地传统通信设备普遍存在三大核心问题,严重制约日常作业与应急…

2026/6/20 14:19:08阅读更多 →
AI写论文超攻略,这4款AI论文生成工具让写职称论文不再发愁!

AI写论文超攻略,这4款AI论文生成工具让写职称论文不再发愁!

你是否还在为写期刊论文、毕业论文或职称论文而感到苦恼呢?在大量文献资料中寻找关键信息,就像在大海里捞珍珠一样困难。而且,千头万绪的格式要求常常让人感到焦虑,反复的修改过程又消耗了我们的耐心,导致许多学术人员…

2026/6/20 14:19:08阅读更多 →
NETCONF/YANG协议与Netopeer2在工业网络自动化管理中的实践

NETCONF/YANG协议与Netopeer2在工业网络自动化管理中的实践

1. NETCONF/YANG协议详解与Netopeer2在OpenIL中的实践应用在工业自动化和网络设备管理领域,我们经常面临一个核心挑战:如何高效、可靠且标准化地配置和管理成百上千台设备。传统的方法,比如通过命令行界面(CLI)逐台登录…

2026/6/20 14:19:08阅读更多 →
中兴光猫配置解密工具终极指南:如何轻松破解加密配置文件

中兴光猫配置解密工具终极指南:如何轻松破解加密配置文件

中兴光猫配置解密工具终极指南:如何轻松破解加密配置文件 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 作为一名网络管理员或技术爱好者,您是否曾…

2026/6/20 14:19:08阅读更多 →
网盘直链下载助手:八大网盘高速下载的纯净解决方案

网盘直链下载助手:八大网盘高速下载的纯净解决方案

网盘直链下载助手:八大网盘高速下载的纯净解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…

2026/6/20 14:19:08阅读更多 →
抖音批量下载专家:douyin-downloader实战指南与架构深度解析

抖音批量下载专家:douyin-downloader实战指南与架构深度解析

抖音批量下载专家:douyin-downloader实战指南与架构深度解析 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback…

2026/6/20 14:14:08阅读更多 →
【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/20 0:02:40阅读更多 →
MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

1. 项目概述与核心价值在嵌入式开发,尤其是电机驱动、LED调光、开关电源这些需要精确控制“能量”的领域,脉冲宽度调制(PWM)技术是工程师手中的一把瑞士军刀。它的本质很简单:用一个固定频率的方波,通过改变…

2026/6/20 0:02:40阅读更多 →
在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

1. 银河麒麟V10桌面系统与软RAID 1基础认知 第一次在银河麒麟V10桌面上折腾软RAID 1时,我踩了不少坑。这个国产操作系统基于Linux内核,但2205版本对软RAID模块做了特殊处理,需要额外操作才能正常使用。软RAID 1其实就是磁盘镜像技术&#xff…

2026/6/20 0:02:40阅读更多 →