第十讲 Query Execution Part 1

1 处理模型【Processing Model】

DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。

  • 针对不同的工作负载进行不同的权衡。

方法1:迭代器模型【Iterator Model】
方法2:物化模型【Materialization Model】
方法3:矢量化/批处理模型【Vectorized / Batch Model】

1.1 迭代器模型

迭代器是最简单的模型。他是一种自顶向下的方法。

每个查询计划【Query Plan】的(物理)操作符【Operator】都实现一个 Next() 函数。

  • 在每次调用时,操作符返回单个元组(需要注意的是,这个元组可以是关于列的一个子集,也可以是 Record ID),如果没有更多元组,则返回 eof 标记。
  • 操作符实现一个循环,即查询计划树中的父操作符在在其子节点的操作符上调用 Next() 来检索其输出元组,然后处理它们。

每个操作符的实现还具有 Open() 和 Close() 函数,它们类似于构造函数和析构函数,但这是用于操作符的罢了。
迭代器模型也称为火山模型【Volcano Model】或管道模型【Pipeline Model】。

如今大多数 DBMS 都使用这种方法,,它使得元组流水线【pipeling】成为可能。
许多运算符必须阻塞,直到他们的子操作符发出所有元组,赭红操作符也被称为 Pipeline Breaker:

  • 连接【Joins】,
  • 子查询【Subqueries】
  • 排序【Order By】

使用这种方法可以轻松进行输出控制。比如我们在查询【Query】中添加 LIMIT 10 子句,那么点那个我们的根操作符在迭代了 10 次后就可以停止了,我们不需要再继续调用 Next 了。

迭代器的约束是:我们一次只能处理一个元组,我们通过 Next 获取一个元组,然后可能会去做一些成本很高的操作,如果我们可以批量处理,那么就可以摊销很多的成本。

1.2 物化模型

物化模式是一种自底向上的方法。当父操作符调用子操作符时,他总是生成他可以生成的所有结果,然后上推给它的父擦作符。

每个操作符一次处理所有输入,然后一次发出所有输出。

  • 操作符将其输出“物化”为单个结果。
  • DBMS 可以下推提示【push down hints】(例如 LIMIT)以避免扫描太多元组。
  • 可以发送物化后的行或者单个行。

输出可以是整个元组 (NSM) 或列的子集 (DSM)。

在该模型下,我们经常会用到内链【inline】,比如图中的 S 表假设有亿万数据,我们将所有元组加载到内存,然后一次返回给父操作符,这种方法太愚蠢了,因此我们会将某些操作符进行内联。

物化模型更适合 OLTP 工作负载,因为查询一次仅访问少量元组。

  • 更低的执行/协调开销。
  • 更少的函数调用/操作符调用

但是不适合具有大量中间结果的 OLAP 查询。 

1.3 矢量模型

矢量模型就像迭代器模型一样,每个运算符都实现一个 Next() 函数,但是每个操作符发出一批元组而不是单个元组。

  • 每个运算符在内部作循环中,一次处理多个元组来加快速度(由于我们一次可以看到所有的数据,我们可以做一些矢量化操作,比如SIMD)
  • 批次的大小可能因硬件或查询属性而异

矢量化模型非常适合 OLAP 查询,因为它大大减少了每个操作符的调用次数,并使得操最符更轻松地使用矢量化 (SIMD) 指令来处理批量元组。 

1.4 PLAN PROCESSING DIRECTION

方法1:自上而下:

  • 从根开始,从其子节点“提取”数据。
  • 元组总是通过函数调用传递。

方法2:自下而上

  • 从叶节点开始,将数据推送到其父节点。
  • 允许对管道中的缓存/寄存器进行更严格的控制。
  • 更适合动态查询重新优化。

但是,大多数系统都是自顶而下的。

2 访问方法【Access Method】

访问方法是 DBMS 访问存储在表中的数据的方式,它在关系代数中未定义。

三种基本的访问方法:

  • 顺序扫描【Sequential Scan】
  • 索引扫描【 Index Scan】(许多变体)。
  • 多索引扫描【Multi-Index Scan】

2.1 顺序扫描【Sequential Scan】

对于表中的每一页【Page】:

  • 从缓冲池中检索它
  • 迭代每个元组并检查是否需要包含它

DBMS 维护一个内部游标,用于跟踪它检查过的最后一个页【Page】/槽【SLot】。、

这几乎总是 DBMS 在执行查询时可以做的最糟糕的事情,但它有时候可能是唯一可用的选择(比如当我们没有任何索引时)。
顺序扫描的优化:

  • 预取【Prefetching】
  • 缓冲池绕过【Buffer Pool Bypass】
  • 并行化【Parallelization】
  • 堆聚簇【Heap Clustering】
  • 延迟物化【 Late Materialization】
  • 数据跳过【Data Skipping】
数据跳过

方法1:近似查询【Approximate Queries】(有损)

  • 对整个表的采样子集执行查询以产生近似结果。
  • 示例:BlinkDB、Redshift、ComputeDB、XDB、Oracle、Snowflake、Google BigQuery、DataBricks

方法2:区域地图【Zone Map】(无损)

  • 预先计算每页的列式聚合【Aggregation】,DBMS 首先检查区域地图【Zone Map】来决定是否要访问该页【Page】。
  • 需要在页面大小与过滤器效能之间进行权衡,因为页面越大,数据也就越多,如果在一个有百万数据的大页上,我们根据区域地图算出需要访问该页,但是该页中可能只有一条数据满足查询条件,但是我们不得不扫描完整的页。
  • 示例:Oracle、Vertica、SingleStore、Netezza、Snowflake、Google BigQuery

2.2 索引扫描【 Index Scan】

DBMS 选择一个索引来查找查询【Query】所需的元组。
使用哪个索引取决于(所有这些都是后面章节里会讲,大概是第12讲):

  • 索引包含哪些属性【attribute】
  • 查询【Query】引用哪些属性【attribute】
  • 属性【attribute】的值域
  • 谓词组合【Predicate composition】
  • 索引是否有唯一键或非唯一键

假设我们有一个包含 100 个元组和两个索引的表:
→ 索引1:age
→ 索引2:dept

SELECT * FROM students

WHERE age < 30

AND dept = 'CS'

AND country = 'CHINA'

场景1:30岁以下的有99人,但是CS部门只有2人。 

在该场景下,我们希望可以选择 dept 索引,因为他的选择性更好,可以顾虑更多的数据

场景1:30岁以下的有 2人,但是CS部门有99人。 

在该场景下,我们希望可以选择 age 索引,因为他的选择性更好,可以顾虑更多的数据

2.3 多索引扫描【Multi-Index Scan】

如果 DBMS 可以在一个查询【Query】中使用多个索引:

  • 使用每个匹配的索引计算 Record ID 的集合。
  • 根据查询【Query】的谓词,来组合这些集合(并集与交集)
  • 检索记录并应用剩余的谓词

实现的数据库:

  • DB2 多索引扫描
  • PostgreSQL 位图扫描
  • MySQL 索引合并

SELECT * FROM students

WHERE age < 30

AND dept = 'CS'

AND country = 'CHINA'

继续复用前面的 age 和 dep 的例子:

  • 我们可以使用第一个检索 idx_age 来匹配满足 age < 30 的 Record ID
  • 然后使用第二个检索 idx_dep 来匹配满足 dept = 'CS' 的 Record ID,
  • 取它们 的交集
  • 检索记录,并检查 country = 'CHINA'

可以使用位图【Bitmap】或哈希表【Hash Table】有效地完成集合交集。

3 修改查询【Modification Query】

修改数据库的操作符(INSERT、UPDATE、DELETE)需要负责修改目标表【table】及其索引【index】,约束检查可以立即在操作符内部发生,也可以推迟到稍后的查询【Query】/事务【Transction】中。


这些运算符的输出可以是 Record ID 或元组数据(即 RETURNING)。

UPDATE/DELETE:

  • 子操作符传递目标元组的 Record ID
  • 必须追踪每一个先前看到过的元组(下面例子里会讲,这也是万圣节问题的解决方案)。

INSERT:

  • 选择1 :在操作符内部物化元组
  • 选择2:操作符插入从子操作符传入【Pass In】的任何元组。

例子:

1️⃣ 假设我们有一张perople表,表中记录了薪水

2️⃣ 现在我想对所有薪水小于 1100 的人作一次 100 元的薪水普调,那么现在我的更新操作符会调用它的子操作符的 Next 方法,该子操作符执行一个索引扫描,以超出所有薪水小于 1100 的工人

 

3️⃣ 在索引扫描中,我们跟随游标遍历数据,并将满足条件的元组返回给父操作符

4️⃣ 然后父操作符将它从索引内删除,然后插入一条更新后的索引


5️⃣ 然后索引游标继续滑动,但是我们会查到刚才插入的那条数据

这就是著名的万圣节问题【HALLOWEEN PROBLEM】,即:更新操作更改元组的物理位置,导致扫描操作符多次访问该元组的异常。

  • 可能发生在聚簇表或索引扫描上。

IBM 研究人员于 1976 年万圣节在 System R 上工作时首次发现。
解决方案:跟踪每个查询【QUery】中修改的 Record ID。 

4 表达式评估【Expression Evaluation】

DBMS 将 WHERE 子句表示为表达式树【Expression Tree】。我们前面看到查询计划【QUery Plan】是一颗关于操作符的数,在每个操作符内部依然可以是树结构。

表达式树中的节点代表不同的表达式类型:

  • 比较(=、<、>、!=)
  • 合取 (AND)、析取 (OR)
  • 算术运算符(+、-、*、/、%)
  • 常数值
  • 元组属性引用【Tuple Attribute Reference】

例子:

1️⃣ 下面是我们要执行的 Prepared 语句,我们调用execute执行它

 2️⃣ 下面是该SQL中的表达式树:

以这种方式评估谓词的速度其实很慢,DBMS 遍历树,对于它访问的每个节点,它必须弄清楚操操作符需要做什么。

我们来考虑这个谓词:WHERE S.val=1

更好的方法,或者说是优化吧,就是直接计算表达式,回想一下 JIT 编译,Postgre 中就有这个特性,它会将表达式部分内联编译(set jit = 'on')。

5. Schedule

到目前为止,我们基本上已经从数据流【data flow】的角度了解了查询处理模型【query processing model】。
控制流【conrol flow】隐含在处理模型【processing model】中。 我们可以使用调度程序【scheduler】使控制流更加明确。
数据库论文中通常不会讨论查询调度程序【scheduler】。 我们将看看 Quickstep(学术)项目中做了什么。 基于允许数据流和控制流之间的频繁切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Cloud Alibaba】9 - OpenFeign集成Sentinel实现服务降级

目录 一、简介Sentinel 是什么如何引入Sentinel 二、服务搭建1.安装Sentinel控制台1.1 下载1.2 启动1.3 访问 2.改造服务提供者cloud-provider服务2.1 引入依赖2.2 添加API2.3 添加配置文件 3.改造cloud-consumer-feign服务3.1 引入依赖3.2 添加Feign接口3.3 添加服务降级类3.4…

刷题日记——机试(1)

1. 字母排序 分析——不排序解题 创建一个大小为128的数组sheet&#xff0c;序号表示ascii码强转为int表示的数值&#xff0c;对应的数组值表示该ascii码在输入字符串中出现的次数设置一个max变量和id变量&#xff0c;max初值为0&#xff0c;从下标为((int)‘A’)开始遍历shee…

海外媒体宣发套餐推广8个要点解析为标题-华媒舍

在当前全球化的时代背景下&#xff0c;海外市场的开拓对于企业的发展至关重要。而海外媒体宣传是一种有效的推广方式&#xff0c;可以帮助企业在全球范围内打开市场。本文将对8个海外媒体宣发套餐的推广要点进行解析&#xff0c;帮助企业了解如何在海外市场进行宣传推广。 1. 媒…

园区水电计量管理系统

园区水电计量管理系统是为工业园区、科技园区等大型综合体设计的一套综合解决方案&#xff0c;主要目的是实现对园区内部水电资源的精确计量、有效管理和公平收费。随着经济的快速发展和产业升级&#xff0c;园区作为产业集聚的重要平台&#xff0c;其能源管理效率直接影响到园…

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

朝阳大力生物带您探索2024第13届生物发酵展新视野

参展企业介绍 长春市朝阳大力生物技术工程设备有限公司成立于1994年&#xff0c;现是一家涵盖制药领域的纯化水、注射用水、纯蒸汽等工艺系统与配液、发酵、细胞培养、灭活、乳化等设备及管道工程的设计、制造、安装及调试的专业公司&#xff0c;公司引进国外先进的技术和设备&…

【电机控制】FOC电机控制

FOC&#xff08;Field-Oriented Control&#xff0c;磁场定向控制&#xff09;是一种电机控制策略&#xff0c;又称矢量控制&#xff0c;是通过控制变频器输出电压的幅值和频率控制三相直流无刷电机的一种变频驱动控制方法。FOC 的实质是运用坐标变换将三相静止坐标系下的电机相…

对于Redis,如何根据业务需求配置是否允许远程访问?

1、centos8 Redis安装的配置文件目录在哪里&#xff1f; 在 CentOS 8 中&#xff0c;默认情况下 Redis 的配置文件 redis.conf 通常位于 /etc/ 目录下。确切的完整路径是 /etc/redis.conf。 2、redis如何设置允许远程登录 修改redis.conf文件 # 继承默认注释掉的bind配置 # …

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Qt】:常用控件(一:概述和QWidget核心属性)

常用控件 一.概述二.QWidget核心属性1.enabled&#xff08;是否可用&#xff09;2.geometry&#xff08;设置坐标&#xff09;3.WindTitle&#xff08;窗口标题&#xff09;4.windowIcon1.绝对路径2.qrc机制 5.windowOpacity&#xff08;透明度&#xff09; 一.概述 Widget是Q…

基于巴法云物联网云平台构建可视化控制网页(以控制LED为例)

0 前言 如今大大小小的物联网云平台非常多&#xff0c;但大部分要收取费用&#xff0c;免费的物联网云平台功能则有很多限制使用起来非常不方便。以百度云物联网云平台为例&#xff0c;它的物可视不支持发布主题&#xff0c;等于可视化界面只能作为数据监控而不具备双向通信的…

mysql dublewrite 双写缓存机制

mysql dublewrite 双写缓存机制&#xff0c;像不像主板双bois系统&#xff0c; 在MySQL的InnoDB存储引擎中&#xff0c;当进行数据写操作时&#xff0c;会先将数据写入到内存中的缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;然后异步刷新到磁盘上的数据文件。为了提…

摆动序列(力扣376)

文章目录 题目前知题解一、思路二、解题方法三、Code 总结 题目 Problem: 376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元…

c++20协程详解(四)

前言 到这就是协程的最后一节了。希望能帮到大家 代码 到这里我们整合下之前二、三节的代码 #include <coroutine> #include <functional> #include <chrono> #include <iostream> #include <thread> #include <mutex> #include <me…

JWT/JWS/JWE

JWT(JSON Web Token)&#xff1a;一种基于JSON格式&#xff0c;用于在Web应用中安全传递用户身份验证和授权信息的标准令牌&#xff0c;可以包含签名(JWS)和加密(JWE)的信息 MacAlgorithm(Message Authentication Code Algorithm)&#xff1a;消息认证码算法 HMAC(Hash-based…

2024/4/1—力扣—两数相除

代码实现&#xff1a; 思路&#xff1a;用减法模拟除法 // 用减法模拟除法 int func(int a, int b) { // a、b均为负数int ans 0;while (a < b) { // a的绝对值大于等于b&#xff0c;表示此时a够减int t b;int count 1; // 用来计数被减的次数// t > INT_MIN / 2:防止…

京东获得JD商品详情 API 接口(jd.item_get)的详细使用说明,包括如何通过该接口获取商品的基本信息,包括名称、品牌、产地、规格参数等

通过调用京东商品详情API接口&#xff0c;开发者可以获取商品的基本信息&#xff0c;如名称、品牌、产地、规格参数等。此外&#xff0c;还可以获取商品价格信息&#xff0c;包括原价、促销价和活动信息等。同时&#xff0c;该接口还支持获取商品的销量、评价、图片、描述等详细…

微信如何识别图片中的文字?3个文字识别技巧分享

微信如何识别图片中的文字&#xff1f;微信识别图片中的文字是一项非常实用的功能&#xff0c;特别是在需要快速提取图片中的信息时。不仅如此&#xff0c;微信识别图片文字的功能也极大地提升了人们的工作和学习效率。在办公场景中&#xff0c;它可以快速将纸质文档、名片、合…

postgresql数据库|数据整合的好工具--Oracle-fdw的部署和使用

概述 Oracle_fdw 是一种postgresql外部表插件&#xff0c;可以读取到Oracle上面的数据。是一种非常方便且常见的pg与Oracle的同步数据的方法 Oracle_fdw 适用场景&#xff1a; Oracle_fdw 是一个开源的 Foreign Data Wrapper (FDW)&#xff0c;主要用于在 PostgreSQL 数据库中…