DuckDB 走进美国大学课堂

引言
在数据科学和分析领域,DuckDB正以其轻量级和高性能的特性,成为美国大学课堂上的新宠。这一多线程嵌入式数据库管理系统(DBMS)不仅简化了数据查询,还为学生提供了深入理解数据库内部机制的机会。DuckDB在CMU的“15-721 Advanced Database Systems”课程中得到了深入探讨。Andy Pavlo教授通过一系列讲座和幻灯片,向学生展示了DuckDB的设计理念和应用案例。
课程内容
主题: “System Analysis (DuckDB)”,DuckDB数据库系统分析
DuckDB简介
• DuckDB是一个高级的、多线程的嵌入式数据库管理系统(DBMS),设计用于在不同的数据文件上执行SQL查询。
• 它被称为“用于分析的SQLite”,因为它具有类似PostgreSQL的方言和嵌入式特性。
• DuckDB通过Apache Arrow提供对查询结果的零拷贝访问,支持DataFrame库(如R语言的dpylr和Python的Pandas DataFrame)进行非SQL查询。
• DuckDB的核心是用几乎完全自定义的C++代码编写的,并且几乎没有第三方依赖。这使得DuckDB具有高度的可移植性和可控性,因为开发者不需要依赖外部库来构建或维护系统。
• DuckDB通过扩展来增强其功能,这为数据库提供了灵活性和可扩展性。
DuckDB的先进技术特性
DuckDB作为现代数据库系统的一个典范,其设计集成了一系列创新技术,这些技术共同提升了数据库的性能和易用性:
1. 共享一切架构(Shared-Everything):
DuckDB采用了这种架构,其中计算和存储资源不是分开的,而是在所有处理器之间共享,从而提高了资源利用率和查询执行的并行性。
1. 推动式矢量化查询处理(Push-based Vectorized Query Processing)
与传统的拉取式模型相比,DuckDB的推动式模型允许每个操作符自主决定是否并行执行,而不是依赖于中央执行器,这提高了查询处理的灵活性和效率。
1. 预编译原语(Precompiled Primitives)
DuckDB使用预编译的函数和操作,这样可以减少运行时的编译开销,加快查询执行速度。
1. 多版本并发控制(Multi-Version Concurrency Control, MVCC)
MVCC是一种用于提高数据库并发性能的技术,它允许在不锁定资源的情况下进行读取和写入操作。
1. 小块并行主义和调度(Morsel Parallelism + Scheduling)
DuckDB通过将大型任务分解为小块(Morsels),并智能地调度这些小块的执行,来优化并行处理。
1. PAX列式存储(PAX Columnar Storage)
DuckDB采用了列式存储格式PAX,它专为分析型工作负载设计,可以提高数据压缩率和查询性能。
1. 排序合并连接和哈希连接(Sort-Merge + Hash Joins)
DuckDB支持这两种类型的连接操作,可以根据查询的具体需求选择最合适的算法。
1. 分层查询优化器(Stratified Query Optimizer)
DuckDB的查询优化器可以处理复杂的查询计划,并支持任意子查询的解套(unnesting),这有助于优化查询性能。
从拉取式到推动式:DuckDB查询处理模型的演变
DuckDB最初采用的拉取式矢量化查询处理模型虽然在性能上有所提升,但在处理更复杂的并行操作时显得力不从心。在这种模型下,系统难以同时启动多个处理流程,这限制了其在高度并行化环境中的性能表现。
为了解决这一问题,DuckDB团队在2021年决定进行一次重大转变,引入了推动式查询处理模型。这一转变的核心是将查询处理的控制权下放到各个操作符,使得每个操作符可以独立决定是否并行执行,而不是完全依赖于一个中央执行器来调度。这种模式不仅提高了查询执行的灵活性,还极大地增强了系统处理复杂并行任务的能力。
在推动式模型中,操作符之间的数据流动是主动的,每个操作符根据自身的条件和需求“推动”数据向下一个操作符流动。这种方法减少了中央协调的开销,允许系统更高效地利用可用的计算资源,并能够更细致地控制查询执行的并行度。
DuckDB的细粒度控制
DuckDB通过一系列精心设计的特性实现了对查询处理的细粒度控制,这些特性共同提升了数据库系统的性能和响应能力:
1. 向量缓存(Vector Cache)
DuckDB利用向量缓存机制,在操作符之间缓冲结果,直到填满一个向量。这种设计减少了磁盘I/O操作的频率,通过在内存中暂存数据来提高处理速度。
1. 扫描共享(Scan Sharing)
在DuckDB的有向无环图(DAG)计划中,扫描共享允许一个子操作符的输出被推送到多个父操作符。这种共享减少了冗余的数据处理,提高了查询执行的效率。
1. 反压/异步I/O(Backpressure Async IO)
当缓冲区满时或在等待远程I/O操作时,DuckDB可以暂停操作符的执行。这种反压机制避免了数据溢出和不必要的等待,使得查询处理更加流畅和可预测。
DuckDB的向量处理
DuckDB在内部设计了一种自定义的向量布局,用于存储中间结果,这种布局与Velox兼容,后者是一个高性能的向量处理引擎。这种设计允许DuckDB以统一的格式处理所有类型的向量,而无需事先进行解压缩,这大大减少了对每种向量类型特定原语的需求。
1. 统一的向量格式:DuckDB通过统一格式处理所有向量类型,简化了查询执行过程中的复杂性。这种方法减少了对不同向量类型所需专用原语的数量,从而提高了查询处理的效率。
2. 多种向量类型支持:DuckDB支持多种物理存储的向量类型,包括:
• Flat Vectors:作为未压缩的连续数组物理存储。
• Constant Vectors:作为单个常量值物理存储。
• Dictionary Vectors:作为由选择向量索引的字典向量物理存储。
• Sequence Vectors:作为基向量和增量偏移向量物理存储。
DuckDB与DataFrame库无缝集成
DuckDB的一个显著特性是其对DataFrame库的支持,这使用户能够使用自己熟悉的编程语言和数据分析框架来查询数据库。这种集成为数据科学家和分析师提供了极大的便利,因为它允许他们继续使用他们已经熟练的工具,同时又能利用DuckDB强大的数据库功能。
1. dpylr (R语言)
对于R语言用户,DuckDB通过dpylr库提供了一个接口,使得他们可以在R环境中无缝地使用DuckDB的功能。
1. Ibis (Python)
Python用户则可以通过Ibis库,利用其熟悉的DataFrame API来执行数据库查询。
这些集成库生成的DuckDB逻辑计划会被数据库管理系统转换为优化的物理计划,这个过程绕过了SQL解析器,从而提高了查询构建的效率。
此外,DuckDB利用Apache Arrow进行零拷贝结果传递,这意味着在查询执行过程中,数据可以在不同组件间高效地移动,而不需要进行昂贵的数据复制操作。
📝:Python 下 DuckDB 可以直接和Pandas DataFrame 集成,并不需要依赖ibis。
DuckDB的存储格式
DuckDB采用了一种内置的存储格式,它为每个数据库维护一个以PAX为导向的单一文件。这种格式的设计旨在优化存储效率和查询性能:
1. 表格分割
DuckDB将表格分割成包含大约120,000个元组的行组。这种分割方法有助于提高数据的可管理性和查询的效率。
1. 内存与磁盘表示的差异
DuckDB在内存中和磁盘上的编码方式不同,以适应各自的访问模式和性能要求。
1. 两阶段压缩方案:DuckDB会先对列的一小部分样本进行分析,以确定最佳的编码方案。这种智能的分析过程有助于选择最合适的压缩算法,从而在不牺牲读取性能的情况下减少存储空间的需求。一旦确定了编码方案,DuckDB会将值进行编码并写入磁盘。这种压缩机制不仅节省了存储空间,还优化了数据的读写操作。
• 压缩阶段
• 分析阶段
MotherDuck:DuckDB的云扩展
DuckDB 的云端服务 MotherDuck 代表了数据库技术在云计算领域的一个创新应用。作为一个基于云的服务,MotherDuck 能够自动在无服务器计算节点上执行 DuckDB 查询,为数据密集型应用提供了强大的支持:
1. 无服务器计算集成
MotherDuck利用无服务器计算节点,这些节点实际上是在容器中运行的DuckDB实例,并且与对象存储相连。这种设计允许系统根据查询需求动态地扩展或缩减资源,而无需担心底层的基础设施管理。
1. 远程目录暴露
MotherDuck将远程节点的目录暴露给本地实例,使得本地DuckDB可以无缝地访问和操作远程数据,就像它们在本地一样。
1. 最新版本的DuckDB集成
DuckDB的最新版本已经包含了连接到MotherDuck的扩展,这表明了DuckDB不断推进其云集成和功能增强的承诺。
MotherDuck的混合查询处理
MotherDuck通过引入创新的“桥接”操作符,进一步增强了DuckDB的分布式查询处理能力。这些操作符负责在本地和远程DuckDB实例之间传递元组流,从而实现数据的无缝整合和处理:
1. 桥接操作符
MotherDuck利用这些操作符来协调本地和远程计算资源的工作,使得查询可以在最适合其数据位置的地方执行。这种设计优化了查询性能,同时减少了数据传输的开销。
1. 推动式执行的优势
DuckDB切换到推动式执行模型后新增的操作符暂停特性,为MotherDuck的桥接操作符提供了支持。当数据缓冲区满或等待远程I/O时,可以暂停操作符的执行,这是实现有效查询处理的关键。
1. 查询优化
在MotherDuck架构中,查询优化首先在本地实例上进行,然后根据成本基规则决定哪些查询在本地执行,哪些在远程执行。这种方法确保了查询以最经济的方式被处理,同时考虑到了性能和资源利用率。
临别思考:DuckDB的明智选择与未来潜力
DuckDB的成功在于它在正确的时间,针对正确的问题,出现在了正确的地方。它的设计巧妙,性能卓越,且易于使用,这些特点使其成为了数据库领域一个令人羡慕的典范。Andy Pavlo教授早期对于内存数据库管理系统(in-memory DBMSs)的研究虽然未能如愿以偿,但他对数据库技术的深刻理解和不懈追求,最终在DuckDB上得到了体现。
DuckDB的故事也提醒我们,开源的力量是巨大的。如果历史上的某些项目,如HyPer/Umbra,能够以开源的形式存在,它们或许也能取得像DuckDB一样的成就。DuckDB的开源策略不仅促进了技术的快速迭代和改进,也吸引了一个活跃的社区,共同推动了数据库技术的发展。
课程简介
15-721 高级数据库系统(15-721 Advanced Database Systems) 是 卡内基梅隆大学(Carnegie Mellon University, CMU)2024年春季学期的一门课程。这门课程全面研究了现代数据库管理系统的内部结构,涵盖了用于大规模分析系统(OLAP,在线分析处理)的核心概念和基本原理。课程将强调这些理念实现的效率和正确性。它适合软件系统领域的研究生以及具有扎实系统编程技能的高年级本科生。
课程信息如下:
• 时间:每周一和周三,下午2:00至3:20
• 地点:GHC 4303教室
• 讨论:通过Piazza平台进行
• 视频:https://www.youtube.com/playlist?list=PLSE8ODhjZXjYa_zX-KeMJui7pcN1rIaIJ
Andy Pavlo教授简介
Andy Pavlo[1]教授是卡内基梅隆大学(Carnegie Mellon University, CMU)计算机科学系的终身副教授,专注于数据库学(Databaseology)。他对数据库系统的深厚兴趣和贡献,使他获得了多项荣誉和认可,包括:
• 2021年的VLDB早期职业奖(VLDB Early Career Award)
• 2019年的国家科学基金会职业发展奖(NSF CAREER Award)
• 2018年的斯隆研究奖学金(Sloan Fellowship)
• 2014年的ACM SIGMOD Jim Gray最佳博士论文奖(ACM SIGMOD Jim Gray Best Dissertation Award)
除了在学术界取得的成就外,Pavlo教授也是OtterTune数据库调整初创公司的首席执行官(CEO)和联合创始人,该公司成立于2020年。OtterTune致力于开发智能化的数据库性能调整工具,以帮助企业和开发者优化数据库配置,提升系统性能。
Pavlo教授在布朗大学(Brown University)攻读博士学位期间,师从Stan Zdonik和Mike Stonebraker两位教授,并于2013年获得博士学位。他对数据库的热爱和专业知识,不仅在学术研究中得到体现,也在他的教学和创业活动中发挥着重要作用。
在CMU,Pavlo教授主讲的“15-721 Advanced Database Systems”课程,将理论与实践相结合,为学生提供了深入了解现代数据库系统的机会。通过他对DuckDB等前沿数据库技术的深入分析,学生能够获得宝贵的知识和技能,为他们将来在数据科学和数据库领域的职业生涯打下坚实的基础。
资料获取
• PPT: https://15721.courses.cs.cmu.edu/spring2024/slides/20-duckdb.pdf
• 视频:https://www.youtube.com/watch?v=4iD4h4sGLz4
• Nortes: https://15721.courses.cs.cmu.edu/spring2024/notes/20-duckdb.pdf
你也可以公众号私信duckdb 获取 PPT,视频和 notes。
引用链接
[1]
Andy Pavlo: https://www.cs.cmu.edu/~pavlo/




