当前位置: 首页 > article >正文

DuckDB的递归CTE性能改进

来源https://github.com/duckdb/duckdb/pull/22211优化递归 CTE 性能 #22211作者:kryonix我终于能够分享这个 PR拉取请求了我感到非常兴奋。说实话我想实现这个功能已经好几年了但一直没时间真正去做。高效执行递归 CTE公共表表达式并不是很多人会思考或关心的事情因此相关的研究很少而且优秀的开源实现基本上也不存在。然而我花在这上面的时间多到我自己都不想承认并把我最好的见解和想法都整合到了这个 PR 中。递归 CTE 执行成本很高因为当前的实现虽然简单但缺乏优化。其执行的基本原理出奇地简单基于半朴素semi-naive评估策略。然而简单之处到此为止性能、并行化和优化才刚拉开序幕。DuckDB 的主要瓶颈在于对于 CTE 的递归部分每次递归迭代都会创建、调度、执行和销毁所有管道pipeline。这极其昂贵也是递归 CTE 执行缓慢的主要原因尤其是当递归部分操作的数据量很小的时候。在这种情况下创建和销毁管道的开销主导了执行时间并且无法很好地分摊。主要瓶颈如下每次递归 CTE 迭代都涉及管道的创建和销毁。对 CTE 递归部分采用静态且过度并行的执行方式当递归部分处理少量数据时无法高效执行。在递归 CTE 的各个迭代之间不复用任何执行状态导致冗余工作和额外开销。这个 PR 通过引入一种新的递归 CTE 执行策略来解决这些瓶颈从而实现更高效的执行。主要更改包括现在线程数会根据正在处理的数据大小动态确定从而允许在递归部分跨迭代处理不同数据量时实现更高效的执行。由于我们可以完美地估计递归工作表的基数因此可以用它来确定每次递归 CTE 迭代的最佳线程数从而在并行执行无益时避免其开销并在有益时使用更多线程。现在执行状态会在递归 CTE 的各个迭代之间复用从而减少了冗余工作和开销。如果在 CTE 的递归部分使用了 HashJoin 运算符这种复用尤其高效因为它可以在迭代之间复用哈希表。现在规划器Planner会尽可能将 CTE 的递归部分放在 HashJoin 的 PROBE探测侧以利用哈希表复用的优化。物理运算符现在有了Reset()方法允许在不销毁和重新创建运算符的情况下重置其状态。此方法用于在迭代之间重置 CTE 递归部分中运算符的状态。PhysicalRecursiveCTE运算符现在在 CTE 的各个迭代之间复用了更多的数据结构从而减少了开销和冗余工作。这方面的例子包括工作表的ColumnDataCollection、DataChunk对象和PipelineExecutor对象。我们跟踪哪些管道在递归 CTE 的各个迭代之间是不变的并且仅在必要时重置这些管道的状态。对于本质上是单线程的递归 CTE现在有一种特殊的执行策略可以在单线程中执行 CTE 的递归部分从而在无益时避免并行执行和通用调度的开销。所有这些改进共同带来了显著的性能提升。但另一方面实现变得明显更加复杂例如因为我们必须为 CTE 的递归部分实现自定义调度逻辑并且必须小心处理跨迭代的运算符和管道状态的重置。另外也是让这个 PR 变得如此庞大的原因是我们必须为物理运算符添加大量的新Reset()方法。然而如果遇到任何不支持重置的运算符我们会回退到完全重置这使实现更加健壮和面向未来因为当添加新的运算符时我们总能为其添加重置支持。所有这些也适用于USING KEY变体的递归 CTE因为两者共享相同的执行引擎和策略。速度有多快性能提升是显著的。不幸的是目前还没有标准化的递归 CTE 基准测试但是 neumannt 实现了一套很棒的 Advent of Code编程挑战谜题这些谜题使用了递归 CTE可以用来衡量递归 CTE 的性能。https://github.com/neumannt/aoc24Day此 PR 与 DuckDB 主分支相比的加速比012.04 倍022.02 倍033.23 倍041.05 倍051.22 倍064.80 倍071.16 倍081.13 倍091.38 倍101.17 倍111.49 倍121.19 倍132.17 倍148.08 倍155.65 倍181.86 倍193.07 倍2011.25 倍212.66 倍231.99 倍252.51 倍如您所见某些查询的性能提升显著高达 11 倍而有些查询则没有那么大的提升。但没有性能回退总体而言递归 CTE 的性能得到了全面显著提升。此外由于多线程的工作方式查询的运行时间现在在不同运行之间更加稳定这是一个不错的改进。一个典型但没实际意义的递归 CTE 基准测试查询如下WITHRECURSIVE cteAS(SELECT1ASnUNIONALLSELECTn1FROMcteWHEREn1000000)SELECT*FROMcte;这通常被认为是 DuckDB 中递归 CTE 的最坏情况因为递归部分只操作单行这完全打乱了 DuckDB 的执行引擎。尽管如此此 PR 将性能提升了大约 25 倍。另一个最坏情况的查询是这个线性图查询DROPTABLEIFEXISTSgraph;CREATETABLEgraph(hereINTEGER,thereINTEGER);-- 1 - 2 - ... - 100000INSERTINTOgraphSELECTi,i1FROMgenerate_series(0,100000)g1(i);WITHRECURSIVE cteAS(SELECThere,thereFROMgraphWHEREhere0UNIONALLSELECTg.here,g.thereFROMgraph gJOINcteONcte.thereg.here)SELECT*FROMcte;对于递归 CTE 来说这个查询同样是最坏情况因为这里的递归部分同样只操作单行。然而可能更糟糕的是graph表在递归 CTE 的每次迭代中都被完全扫描使得graph g JOIN cte ON cte.there g.here这部分执行成本非常高昂。通过这个 PR性能得到了巨大提升大约 100 倍但您实际上可以通过改变graph表中的行数来选择这个倍数。对于此类查询能够在迭代之间复用在graph表上构建的哈希表是一个改变游戏规则的因素因为它允许我们只扫描graph表一次然后用每次迭代产生的新行持续进行探测。这是递归 CTE 中一种非常常见的模式而这个 PR 正是针对这种模式进行了优化。这应该会使递归 CTE 在图查询中更加实用而图查询正是递归 CTE 的一个常见用例。

相关文章:

DuckDB的递归CTE性能改进

来源:https://github.com/duckdb/duckdb/pull/22211 优化递归 CTE 性能 #22211 作者: kryonix 我终于能够分享这个 PR(拉取请求)了,我感到非常兴奋。说实话,我想实现这个功能已经好几年了,但一直没时间真正…...

OpenModScan:完全免费的Modbus主站测试工具终极指南

OpenModScan:完全免费的Modbus主站测试工具终极指南 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan 还在为昂贵的工业通讯测试工具而烦恼吗?面对…...

从DLSS-G到FSR3:打破N卡独占,让AMD显卡也能享受帧生成技术

从DLSS-G到FSR3:打破N卡独占,让AMD显卡也能享受帧生成技术 【免费下载链接】dlssg-to-fsr3 Adds AMD FSR 3 Frame Generation to games by replacing Nvidia DLSS Frame Generation (nvngx_dlssg). 项目地址: https://gitcode.com/gh_mirrors/dl/dlssg…...

物联网卡充值/续费总失败?可能是你的ICCID号输错了!保姆级避坑指南

物联网卡充值总失败?ICCID输入避坑全攻略 每次给物联网卡充值都像在玩扫雷游戏?输完20位ICCID号码后,系统却无情地弹出一行红色警告:"充值失败"。这种场景对于管理大量物联网设备的企业IT人员来说,简直是日常…...

智能图像质量评估:用AI为海量图片自动打分的实战指南

智能图像质量评估:用AI为海量图片自动打分的实战指南 【免费下载链接】image-quality-assessment Convolutional Neural Networks to predict the aesthetic and technical quality of images. 项目地址: https://gitcode.com/gh_mirrors/im/image-quality-assess…...

5个关键优化技巧:让你的Amlogic TV盒子OpenWrt性能飙升300% [特殊字符]

5个关键优化技巧:让你的Amlogic TV盒子OpenWrt性能飙升300% 🚀 【免费下载链接】amlogic-s9xxx-openwrt Supports running OpenWrt on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s9…...

别再手动写Cron了!用Furion的ScheduleUI可视化管理和调试你的.NET定时任务

告别硬编码:用Furion的ScheduleUI重塑.NET定时任务管理体验 在.NET生态中,定时任务管理长期处于"石器时代"——开发者不得不通过繁琐的代码配置和XML文件定义任务,每次修改都需要重新编译部署。这种开发模式不仅效率低下&#xff…...

DayZ单机模组终极指南:5步打造完美离线生存体验

DayZ单机模组终极指南:5步打造完美离线生存体验 【免费下载链接】DayZCommunityOfflineMode A community made offline mod for DayZ Standalone 项目地址: https://gitcode.com/gh_mirrors/da/DayZCommunityOfflineMode DayZCommunityOfflineMode是一款社区…...

抖音批量下载神器:3分钟搞定100个视频的终极解决方案

抖音批量下载神器:3分钟搞定100个视频的终极解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

三分钟看懂缠论:通达信自动分析插件让复杂理论秒变实战工具

三分钟看懂缠论:通达信自动分析插件让复杂理论秒变实战工具 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为缠论复杂的笔段划分和中枢识别头疼吗?ChanlunX缠论可视化插件将改…...

从PoC到生产:Gemini3.1pro风控与监控实战清单

做 Gemini 相关的应用,很多团队都经历过同样的阶段:PoC 时效果不错、Demo 能跑通;一旦上量进入生产,稳定性、合规、成本与用户体验开始“集中翻车”。原因往往不是模型本身变差了,而是PoC 没把风险当成系统能力来设计。…...

Gemini3.1pro 多语言工程:中英对齐与质量治理实战

做多语言创作或客服类应用时,最常见的痛点不是“翻译不够好”,而是同一个 Prompt 在中英两种语言下表现差异巨大:中文更像“结构化分析”,英文却变成泛泛而谈;中文能严格遵守格式,英文却更容易跑偏&#xf…...

用Python和Librosa库5分钟搞定MFCC特征提取(附完整代码与避坑指南)

5分钟实战:用PythonLibrosa高效提取MFCC语音特征 语音特征提取是智能语音处理的基础环节,而MFCC(梅尔频率倒谱系数)因其符合人耳听觉特性,成为最常用的特征之一。传统实现需要手动完成预加重、分帧、Mel滤波器组等复杂…...

星露谷农场规划器:告别杂乱农场,开启高效种植新时代

星露谷农场规划器:告别杂乱农场,开启高效种植新时代 【免费下载链接】stardewplanner Stardew Valley farm planner 项目地址: https://gitcode.com/gh_mirrors/st/stardewplanner 你是否曾在《星露谷物语》中面对杂草丛生的农场感到束手无策&…...

AI写教材必备!低查重工具助力,快速生成符合要求的教材!

整理教材的重点知识可谓是一项“细致活”,难的在于如何达到平衡与衔接的效果!有时我们会担心漏掉关键知识点,有时又难以掌控知识的难度层次——小学的教材往往写得太复杂,导致学生难以理解;而高中教材则可能太简单&…...

欧姆龙PLC与上位机通信实战:手把手教你用C#解析CIP协议报文(附完整代码)

欧姆龙PLC与上位机通信实战:C#解析CIP协议报文全流程指南 工业自动化领域中,欧姆龙PLC凭借其稳定性和灵活性成为众多生产线的核心控制设备。而实现上位机与PLC的高效通信,则是每个自动化工程师必须掌握的技能。本文将深入探讨如何通过C#语言…...

掌握AI教材生成技巧!低查重工具助你轻松编写专业教材

传统教材编写困境与 AI 解决方案 编写教材的过程离不开充足的资料支持,但传统的资料整合方式早已无法满足需求。过去,从教材标准、学术文献到教学实例,相关信息散布在知网、教研平台等多个渠道,筛选出有用的信息往往需要耗费几天…...

Mecpow X3 Pro激光雕刻机评测与使用技巧

1. Mecpow X3 Pro激光雕刻机深度评测与实战指南作为一名长期从事数字制造和DIY项目的技术博主,我最近测试了Mecpow最新推出的X3 Pro 10W激光雕刻机。这款设备最吸引我的是其创新的空气辅助系统和专业级的安全防护设计,特别适合DIY爱好者和小型工作室使用…...

Time2Vec实战:5分钟为你的LSTM/Transformer时序模型注入“时间感知”能力

Time2Vec实战:5分钟为你的LSTM/Transformer时序模型注入“时间感知”能力 当你的时序预测模型总是错过早高峰的流量激增,或是忽略每周五的消费峰值,问题可能不在于数据量或模型复杂度,而在于时间特征的低效编码。传统方法将时间戳…...

快递保价理赔程序,货物价值上链,丢失破损,按约定自动赔付。

一、实际应用场景描述在快递与物流场景中,用户对高价值物品(如电子产品、艺术品、仪器配件)通常会选择保价服务。典型流程包括:- 寄件人申报货物价值- 支付保价费用- 出现丢失或破损后申请理赔- 平台人工审核并赔付在传统模式下&a…...

AISMM模型落地难题:3步构建动态竞争分析体系,90%企业已错过最佳窗口期

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与竞争分析 AISMM(Artificial Intelligence Strategic Maturity Model)是一种面向企业级AI能力演进的五阶段评估框架,涵盖意识(Awareness&#…...

AISMM不是概念!已落地5大场景的专利组合策略(含医疗影像实时推理、车规级边缘调度等8个真实授权案例)

更多请点击: https://intelliparadigm.com 第一章:2026奇点智能技术大会:AISMM与专利布局 2026奇点智能技术大会(Singularity Intelligence Summit 2026)正式发布全新智能模型架构——AISMM(Adaptive Int…...

AISMM与DCAM/DMM整合实践全图谱(2024权威认证版):覆盖L1-L5成熟度跃迁的12个关键耦合点

更多请点击: https://intelliparadigm.com 第一章:AISMM与DCAM/DMM整合的理论根基与演进逻辑 AISMM(Artificial Intelligence Systems Maturity Model)并非孤立演进的评估框架,其设计深度植根于数据治理成熟度模型&am…...

iFSQ量化技术:1行代码提升图像生成质量

1. 项目概述:iFSQ的量化革新在图像生成领域,量化技术一直扮演着关键角色。传统FSQ(Finite Scalar Quantization)方法虽然有效,但在处理复杂图像时仍存在细节丢失和计算效率问题。iFSQ的提出,正是为了解决这…...

Dayflow:基于AI的自动化时间追踪工具,在隐私与智能间寻找平衡

1. 项目概述:Dayflow,一个理解你一天在做什么的AI时间线 如果你和我一样,每天对着电脑屏幕忙忙碌碌,但到了晚上复盘时,却常常想不起来时间到底花在了哪里——“我下午那三个小时到底在干嘛?”——那么&…...

WarcraftHelper:5分钟解锁魔兽争霸3完整游戏体验的终极指南

WarcraftHelper:5分钟解锁魔兽争霸3完整游戏体验的终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》在现代电脑…...

别再只会用--from-beginning了!Kafka Console Consumer的5个隐藏参数实战指南

别再只会用--from-beginning了!Kafka Console Consumer的5个隐藏参数实战指南 如果你已经熟悉kafka-console-consumer.sh的基础用法,可能经常用--from-beginning参数从头消费消息。但Kafka的控制台消费者远不止于此——它隐藏了许多强大参数,…...

Eclipse老用户看过来:告别手动配置,用Gradle+Boot一步搞定Spring Boot项目(附完整build.gradle)

Eclipse老用户迁移指南:用GradleBoot打造高效Spring Boot工作流 如果你是从Eclipse时代走过来的Java开发者,可能还记得那些手动管理JAR包的日子——下载依赖、配置classpath、解决版本冲突,每一步都充满挑战。如今,Gradle和Spring…...

告别强制登录!保姆级教程:在Mac/Windows上降级Postman到9.31.28,完整恢复Runner测试功能

告别强制登录!保姆级教程:在Mac/Windows上降级Postman到9.31.28,完整恢复Runner测试功能 Postman作为API开发者的瑞士军刀,其强制登录策略让不少用户感到困扰。特别是当我们需要快速验证接口限流策略或在内网环境调试时&#xff0…...

08-MLOps与工程落地——特征存储:Feast

特征存储:Feast(在线/离线特征存储、特征复用、训练服务一致性) 一、Feast概述 1.1 什么是特征存储? import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, FancyBboxPatch import warnings warnings.filt…...