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

cmu15445 2025fall lec13 Query Execution Pt.1

lec13 Query Execution Pt1目前已经基本实现了基础模块(排序aggregation,join)接下来就是如何把这些东西整合到一起来执行查询intro从query plan 里细化了1 pipeline:一系列算子的序列元组在他们之间连续流动不需要中间存储2 pipeline breaker: 指那些在获取其子算子的所有元组之前无法完成工作的算子(比如joins, subqueries, order by)Agendaprocessiong models, access methods, modification queries, expression evaluationProcessiong models基础知识定义处理模型定义了 DBMS 如何执行查询计划以及数据如何在算子Operator之间流动。执行路径的两大组成部分每个处理模型都包含两种基本路径控制流 (Control Flow)DBMS如何调用一个算子。即决定“什么时候该谁干活”的逻辑比如自顶向下的拉取或自底向上的推送。数据流 (Data Flow)算子完成工作后如何发送其结果。即数据是以什么形式传递给下一个环节的。Approach #1: Iterator Modelmost common(OLTP)它也被形象地称为Volcano火山模型或流水线模型 (Pipeline Model)。以下是它的核心机制核心方法Next()这是该模型运行的灵魂。查询计划中的每个算子都必须实现一个Next()函数自顶向下调用查询计划的最顶层算子根节点调用Next()然后这个调用会像链条一样向下传递。一次返回一条每次调用Next()算子要么返回一个元组一行数据要么返回一个EOF文件结束标志表示数据已取完。递归逻辑当一个算子被调用Next()时它会在内部循环调用其子算子的Next()获取数据处理后再返回给上一层。生命周期管理Open()和Close()除了取数据算子还需要管理自己的状态Open()初始化算子。类似于构造函数用于分配内存、打开文件或准备内部状态。Close()清理算子。类似于析构函数用于释放资源。为什么它很重要流式处理由于它一次只处理一条数据不需要在算子之间存储巨大的中间结果因此非常节省内存。易于实现每个算子的逻辑都是独立的耦合度低。几乎所有 SQL 数据库都在用如 MySQL、PostgreSQL 和早期的 SQL Server 都是基于这个模型构建的。Approach #2: Materialization Modelrare与之前的迭代模型一次处理一条不同它的核心逻辑是“全量处理”。 以下是详细解释核心运作方式一次性完成全入全出每个算子会一次性处理掉所有的输入数据然后一次性输出所有的结果。“物化”输出算子会将处理完的所有结果作为一个完整的集合“物化”存放在内存或磁盘中然后传给下一个算子。优化与灵活性下推暗示 (Hints)为了防止数据量过大导致崩溃DBMS 会下推类似LIMIT的指令告诉底层算子“只需要处理前 N 条”从而避免扫描全表。数据格式它可以输出整行NSM适合 OLTP也可以输出单列或列的子集DSM适合 OLAP。特点与适用场景优点减少调用开销不像迭代模型那样需要数百万次的Next()函数调用它只调用一次减少了指令执行的负担。适合小型查询对于 OLTP短小精悍的查询这种方式非常快。缺点内存压力大如果中间结果集非常大会消耗海量内存甚至需要溢写到磁盘。延迟高上层算子必须等到下层算子全部做完才能开始工作。不适合用于LIMIT这种需要数据子集的算子/命令历史渊源这种模式在 90 年代由MonetDB开发旨在一次处理整列数据而非单行是列式存储处理的先驱。Approach #3: Vectorized / Batch Modelcommon这张图解释了向量化模型 (Vectorization Model)它是现代高性能数据库尤其是 OLAP 场景的主流选择。它是对迭代模型和物化模型的“折中”与进化核心逻辑如下它是如何运作的结构相似它沿用了迭代模型的结构每个算子依然实现Next()函数。批量发送 (Batch)不同之处在于每次调用Next()不再只返回一条数据而是返回一组元组a batch of tuples。内部循环算子的内部循环会一次性处理这一批数据。关键特性灵活的 Batch 大小Batch 的大小可以根据硬件如 CPU 缓存大小或查询的具体属性进行调整。数据组织每个 Batch 通常包含一列或多列数据并且每列都有自己的Null 位图 (Null Bitmaps)用于标记哪些位置是空值。为什么它更强大减少函数调用相比迭代模型它极大地减少了Next()的调用次数降低了开销。利用 SIMD 指令因为它处理的是数组BatchCPU 可以使用SIMD单指令多数据指令集来并行处理数据性能飞跃。缓存友好Batch 的大小通常设计为能刚好放入 CPU 的L1 缓存中减少了从内存读取数据的延迟。总结如果迭代模型是“接一杯水”物化模型是“装一桶水”那么向量化模型就是“传一箱瓶装水”。它既保留了流水线的灵活性又获得了极高的批量处理性能。Access methods定义它是数据库管理系统DBMS从表中检索存储数据的具体方式。三种基本途径全表扫描 (Sequenial Scan)逻辑遍历表中的每一个页面Page读取每一条记录。适用查询没有索引的列或者需要处理表中大部分数据时。有很多优化方法(data skipping有损和无损)索引扫描 (Index Scan)逻辑通过辅助的数据结构如 B 树、哈希索引快速定位数据。变体包括唯一扫描、范围扫描等。多索引扫描 (Multi-Index Scan)逻辑如果一个查询涉及多个带索引的列DBMS 可能会同时扫描多个索引将结果通常是 Record ID进行交集 (And)或并集 (Or)操作后再取回数据。modification queriesINSERT UPDATE DELETE修改算子的职责同步更新这些算子不仅负责修改目标表Heap/Table中的数据还必须同时负责修改所有相关的索引。约束检查 (Constraint Checks)立即检查在算子执行修改时立即验证例如检查主键是否重复、非空约束。延迟检查等到事务提交Commit时才统一验证。输出结果 (Output)与SELECT不同修改算子的输出通常有两种形式Record IDs返回受影响行的内部标识符。元组数据 (RETURNING)有些数据库支持在修改后直接返回被修改的整行内容例如 PostgreSQL 的INSERT ... RETURNING *。UPDATE/DELETE这两个操作的核心是“先找到再处理”传递 Record ID子算子通常是扫描算子负责定位符合条件的行并将这些行的Record ID物理标识符传递给修改算子。追踪已处理记录算子必须记录keep track of已经处理过的元组。原因这是为了避免我前面提到的“万圣节问题 (Halloween Problem)”。如果更新操作改变了数据的物理位置或索引值防止同一个查询计划在后续扫描中再次读到这一行从而导致重复更新。INSERT两种实现策略插入操作的实现取决于数据的来源选择 #1 算子内部物化 (Materialize)场景如INSERT INTO T VALUES (1, abc)。逻辑数据就在 SQL 语句中算子直接在内部构造出完整的元组并写入表。选择 #2 接收子算子传递 (From Child)场景如INSERT INTO T (SELECT * FROM S)。逻辑算子作为一个接收端将子算子对表 S 的查询源源不断传上来的元组直接插入到目标表中。万圣节问题这个概念最早由 IBM 的研究人员在 1976 年的万圣节当天发现。他们发现一个简单的加薪 SQL 导致公司所有人的薪水都变成了上限值。expression evaluation这张图讲解的是数据库如何处理 SQL 中的计算逻辑即表达式计算 (Expression Evaluation)。在之前的图中我们看到了查询计划算子树而每一个具体的WHERE子句或计算公式在数据库内部则是通过表达式树 (Expression Tree)来表示的。execution contextcurrent tuple | query parameters | table schemaEvolving....传统方式树遍历解释执行做法如右上方所示将s.val 1转化为一棵树。对于每一行数据CPU 都要递归地遍历这棵树。弊端对 CPU 极不友好。每次访问节点都要判断操作类型是等于还是加法、处理分支预测、进行函数调用。如果数据有上亿行这种开销会造成巨大的性能浪费。进阶方式直接评估JIT 编译做法不再遍历树而是利用LLVM或gcc/Clang等工具在查询运行时动态地将表达式编译成一段简短的机器码Machine Code。效果如右侧红色箭头所示原本复杂的树变成了一个简单的 C 函数return (val 1)。CPU 执行这段代码的速度比遍历树快几个数量级因为它消除了所有不必要的跳转和判断。终极方式向量化Vectorization做法在编译的基础上一次性处理一批a batch元组。核心利用 CPU 的SIMD单指令多数据指令集。例如一条指令同时比较 8 个或 16 个整数是否等于 1。优势这是目前 OLAP分析型数据库如 ClickHouse、DuckDB能跑得飞快的核心秘密。optimizations常量折叠 (Constant Folding)原理识别查询中多余或不必要的计算。如果一个子表达式的所有输入都是常量那么它的结果也是固定的。优化逻辑DBMS 会在查询编译阶段预先算出这个值然后在执行时用结果替换掉原来的表达式。例子图中UPPER(wutang)会被直接优化为常量WUTANG。好处避免对每一行数据per tuple都重复执行相同的计算函数如UPPER。公共子表达式消除 (Common Sub-Expr. Elimination)原理识别在同一个查询树中重复出现的完全相同的子表达式。优化逻辑DBMS 只会计算一次该子表达式的值然后将结果缓存起来供树中的其他位置重复使用。例子图中STRPOS(x, col1)在OR的左右两侧都出现了。优化后系统只需计算一次位置值然后分别判断它是否 2或 8。好处显著减少昂贵的函数调用次数特别是当子表达式涉及复杂的字符串处理或数学运算时。

相关文章:

cmu15445 2025fall lec13 Query Execution Pt.1

lec13 Query Execution Pt1目前已经基本实现了基础模块(排序,aggregation,join),接下来就是如何把这些东西整合到一起来执行查询intro从query plan 里细化了 1 pipeline:一系列算子的序列,元组在他们之间连续流动,不需要中间存储 …...

RANSAC(随机采样一致性算法)

🧮 数学原理与公式推导 1. 迭代次数计算公式 迭代次数 N N N 的确定基于概率理论: N = log ⁡ ( 1 − p ) log ⁡ ( 1 − ( 1 − e ) s ) N = \frac{\log(1-p)}{\log(1-(1-e)^s)} N...

哔哩下载姬downkyi:如何用5分钟解决B站视频下载的三大痛点

哔哩下载姬downkyi:如何用5分钟解决B站视频下载的三大痛点 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&a…...

一键转换:Save Image as Type终极指南 - 3秒解决浏览器图片格式难题

一键转换:Save Image as Type终极指南 - 3秒解决浏览器图片格式难题 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirr…...

告别虚拟机!用Termux在安卓手机上跑Ubuntu的保姆级教程(含自动登录配置)

告别虚拟机!用Termux在安卓手机上跑Ubuntu的保姆级教程(含自动登录配置) 每次出差都要背着沉重的笔记本,或是临时需要调试代码却发现手边没有电脑?现在,你的安卓手机就能变身便携Linux工作站。想象一下&…...

终极解决方案:如何在MusicBee中完美获取网易云音乐同步歌词

终极解决方案:如何在MusicBee中完美获取网易云音乐同步歌词 【免费下载链接】MusicBee-NeteaseLyrics A plugin to retrieve lyrics from Netease Cloud Music for MusicBee. 项目地址: https://gitcode.com/gh_mirrors/mu/MusicBee-NeteaseLyrics 还在为Mus…...

番茄小说下载器:5分钟打造个人离线图书馆的终极指南

番茄小说下载器:5分钟打造个人离线图书馆的终极指南 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在通勤地铁上、旅行途中或网络信号不佳的地方&#xf…...

Windows Cleaner完整教程:5分钟学会磁盘清理技巧,彻底解决C盘爆满问题

Windows Cleaner完整教程:5分钟学会磁盘清理技巧,彻底解决C盘爆满问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 还在为Windows系统C…...

3分钟搞定微信多设备登录:免Root实现安卓平板模式

3分钟搞定微信多设备登录:免Root实现安卓平板模式 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 还在为微信只能登录一个设备而烦恼吗?想象一下这样的场景:你的手机登录了…...

Qt虚拟键盘开发避坑指南:如何用QKeyEvent模拟真实按键,避免焦点丢失的坑?

Qt虚拟键盘开发实战:精准事件传递与焦点控制技术解析 在嵌入式设备和触屏应用中,虚拟键盘的实现质量直接影响用户体验。许多开发者会遇到这样的困境:精心设计的键盘界面点击后,输入框的光标却神秘消失,或者按键事件无法…...

1个终极网盘直链解析解决方案:如何摆脱下载限速实现全速下载?

1个终极网盘直链解析解决方案:如何摆脱下载限速实现全速下载? 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…...

别再硬编码了!用Elasticsearch的Terms lookup query实现动态搜索条件(附用户偏好推荐实战)

动态搜索的艺术:用Elasticsearch Terms lookup构建个性化推荐系统 每次打开购物APP,首页推荐总能精准命中你的喜好——这背后藏着怎样的技术魔法?想象一下,当用户A喜欢电子产品而用户B偏爱美妆时,如何让同一套代码自动…...

告别玄学调参:用‘对齐’和‘均匀性’两个指标,手把手优化你的对比学习模型

对比学习调参实战:用对齐性和均匀性指标优化模型性能 在计算机视觉和自然语言处理领域,对比学习已经成为无监督表示学习的主流方法之一。SimCLR、MoCo等框架的成功应用证明了对比学习在提取高质量特征方面的强大能力。然而,许多工程师在实际应…...

让你的技术文档和Readme“活”起来:GitHub/GitLab Markdown表情使用指南与最佳实践

让你的技术文档和Readme“活”起来:GitHub/GitLab Markdown表情使用指南与最佳实践 在开源项目的世界里,第一印象往往决定了开发者是否会驻足深入了解你的项目。而技术文档和Readme作为项目的"门面",如何让它们在众多同类项目中脱颖…...

3步搞定视频硬字幕提取:本地化AI工具终极指南

3步搞定视频硬字幕提取:本地化AI工具终极指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。A…...

免费虚拟游戏手柄终极指南:vJoy完整配置与开发实战

免费虚拟游戏手柄终极指南:vJoy完整配置与开发实战 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 想要在Windows系统上创建自定义的游戏控制器,却不想购买昂贵的硬件设备?您是否遇到过游…...

.NET C# New Features 新增功能介绍-ASP.NET Core

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...

C# 13新特性 × Blazor深度耦合面试题集:Record structs在组件状态管理中的不可变陷阱,模式匹配路由解析实战(VS2026预览版实测)

第一章:C# 13 Blazor 2026现代Web开发趋势概览C# 13 和 Blazor 2026 的协同演进正重新定义全栈 .NET Web 开发的边界。语言层面,C# 13 引入了原生泛型属性(primary constructors 增强)、模式匹配对 ref struct 的完整支持&#x…...

拆解一个百元级激光雷达模块:用RPLIDAR A1或思岚科技Slamtec做个DIY避障小车(附代码)

百元级激光雷达DIY实战:从RPLIDAR A1到自主避障小车的完整指南 激光雷达技术正以惊人的速度渗透到消费级市场,曾经动辄上万元的设备如今只需几百元就能入手。这为机器人爱好者和创客们打开了一扇全新的大门——我们可以用RPLIDAR A1这类低成本设备&#…...

告别FPS采样慢!用RandLA-Net的随机采样高效处理大规模点云(附S3DIS数据集实战)

突破大规模点云处理瓶颈:RandLA-Net随机采样技术深度解析与实战 点云数据处理在自动驾驶、三维重建和机器人导航等领域扮演着关键角色,但传统方法如FPS(最远点采样)在面对百万级点云时往往力不从心。我曾在一个城市级三维建模项目…...

D3KeyHelper终极指南:5分钟上手暗黑3最强按键宏工具

D3KeyHelper终极指南:5分钟上手暗黑3最强按键宏工具 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中频繁的技能操作而手指酸…...

别再踩坑了!微信小程序this.setData修改对象属性的两种正确姿势(附数组场景)

微信小程序this.setData操作对象属性的深度避坑指南 刚接触微信小程序开发时,我曾在this.setData修改对象属性上栽过不少跟头。记得有一次深夜调试,明明逻辑看起来没问题,页面却始终不更新,最后发现是对象属性修改方式不当导致的。…...

C# 文件上传的服务器端加密 C#如何在存储到S3或Azure Blob时启用加密

必须在IFormFile流读取完成后、写入S3前加密,使用AesGcm或AesCryptoServiceProvider,密钥和nonce须安全存储于配置或Key Vault,S3 ContentLength需设为加密后真实长度。ASP.NET Core 中上传文件后立即加密再传 S3直接在内存中加密&#xff0c…...

【产教融合,协同育人】Altium 出席第七届全国高校自动化类专业教学论坛

2026年4月10日至12日,第七届全国高校自动化类专业教学论坛在西安盛大启幕。作为合作伙伴,Altium 教育生态负责人宋斌出席了此次大会,与在场代表们共话自动化类专业高质量发展新路径、新形态与新实践。Altium 教育生态负责人宋斌进行主题演讲依…...

linux 安装 Elasticsearch Kibana

1.下载 通过网盘分享的文件:es 链接: https://pan.baidu.com/s/1JO07VJ8nVsfyC0TzHaLGKw?pwd1dgu 提取码: 1dgu 2.创建 es 用户, es 无法使用root用户启动 # 创建用户组用户 groupadd es useradd -m -g es es # 设置密码(可选) passwd es # …...

LeetCode 1722. 执行交换操作后的最小汉明距离 详细技术解析

LeetCode 1722. 执行交换操作后的最小汉明距离 详细技术解析 一、题目核心考点剖析 本题的核心是理解「允许交换」的本质的,以及如何利用这种交换特性最小化汉明距离。关键考点如下: 交换的传递性:allowedSwaps 中给出的交换对具有传递性。例如,若允许交换 [0,1] 和 [1,2…...

Driver Store Explorer:Windows驱动存储管理的开源系统优化工具终极指南

Driver Store Explorer:Windows驱动存储管理的开源系统优化工具终极指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾为Windows系统中不断膨胀的驱动存储而烦恼&…...

PYTHON学习笔记12(os模块)

OS文件/目录方法os模块是python标准库中的一个重要模块,提供了与操作系统交互的功能,通过此模块可以执行文件操作、目录操作、环境变量管理、进程管理等任务。os模块是跨平台的,可以在不同的操作系统使用相同的代码。使用os模块之前&#xff…...

3分钟搞定B站旧版界面恢复:Bilibili-Old完整使用教程

3分钟搞定B站旧版界面恢复:Bilibili-Old完整使用教程 【免费下载链接】Bilibili-Old 恢复旧版Bilibili页面,为了那些念旧的人。 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Old 还在怀念B站那个简洁经典的小电视播放器吗?…...

别再只调参了!用PyTorch的torchvision.transforms给你的CIFAR-10模型做个‘数据SPA’

数据SPA革命:用torchvision.transforms解锁CIFAR-10模型的隐藏潜力 当你的ResNet-18在CIFAR-10上准确率卡在75%时,与其无休止地调整学习率和batch size,不如试试这个被多数人忽视的"数据美容术"。想象一下,同样的训练样…...