首页 > 其他分享 >Lecture#11 Joins Algorithms

Lecture#11 Joins Algorithms

时间:2023-04-13 15:14:31浏览次数:35  
标签:11 Join 外表 JOIN Cost Algorithms 哈希 Lecture 连接

1 Joins

在关系型数据库中,我们常常通过规范化 (Normalization) 设计避免信息冗余;因此查询时,就需要通过 Join 将不同 table 中的数据合并来重建数据。

本课关注双表的内等值连接。原则上我们希望,连接时将小表放到左侧 (作为外表)。

首先要讨论的是:Join 的输出和成本分析。

1.1 Operator Output

逻辑上 Join 的操作的结果是:对任意一个 tuple \(r \in R\) 和任意一个在 Join Attributes 上对应的 tuple \(s \in S\) ,将 r 和 s 串联成一个新的 tuple。

image-20230413013801739

现实中,Join 操作输出元组内容还取决于 processing model, storage model 和 query 本身。下面列举了几种输出元组的内容:

1️⃣ Data:Join 时,将内表和外表的所有非 Join Attributes 的属性都复制到输出元组中。

又称 提前物化。优点是:Join 之后的操作都无需从原表中重新获取数据;缺点是:需要更多地内存。

image-20230413014617027

2️⃣ Record Ids:Join 时,只将内外表的 Join Attributes 及 record id 复制到输出元组,后续操作自行根据 record id 去原表中获取相关数据。

又称 推迟物化(Late Materialization)。适用于列存储数据库,因为这样 DBMS 不需要复制对于查询没用的属性。

image-20230413014802584

1.2 I/O Cost Analysis

由于数据库中的数据量通常较大,无法一次性载入内存,因此 Join Algorithm 的设计目的,在于减少磁盘 I/O,因此我们衡量 Join Algorithm 好坏的标准,就是 I/O 的数量。此外我们不需要考虑 Join 结果的大小,因为不论使用怎样的 Join Algorithm,结果集的大小都一样。

之后的讨论都建立在这样的情景:

  • 对 \(R\) 和 \(S\) 两个 tables 做 Join
  • \(R\) 中有 \(M\) 个 pages,\(m\) 个 tuples
  • \(S\) 中有 \(N\) 个 pages,\(n\) 个 tuples

下面介绍的连接算法都有各自的适用场景,没有一个算法可以在所有场景下表现良好,需要具体问题具体分析。

2 Nested Loop Join

也就是暴力循环算法。

总体上来看,这个嵌套循环算法主要由 2 个 for 嵌套,每个 for 分别迭代一个表,如果两个元组符合连接谓词,就输出它们。

在外循环的表叫做外表,在内循环的表叫做内表。以下的讨论中 \(R\) 表是外表,\(S\) 表是内表。

DBMS总是希望小表当做外表,这里的“小”是指占用的页数或者元组个数。DBMS 希望在内存中缓存尽量多的外表,在遍历内表时也可以使用索引加速。

2.1 Simple Nested Loop Join

傻瓜式暴力两层大循环嵌套。

对于外表 \(R\) 的每一个元组,都遍历一遍 \(S\) 表,没有任何缓存机制,没有利用任何局部性。

image-20230413115115461

磁盘 I/O Cost:\(M + (m × N)\)

\(M\) 是读入外表 (\(R\)) 的 I/O 次数,然后对于 \(R\) 表的 \(m\) 个元组,每个都扫描一遍内表 (\(S\))。

标签:11,Join,外表,JOIN,Cost,Algorithms,哈希,Lecture,连接
From: https://www.cnblogs.com/angelia-wang/p/17314896.html

相关文章

  • win11跳过联网_适合7天无理由退货
    第一次开机之后,跳过前面两个设置,我们来到联网界面,和win10不同的是,这个界面并没有预设跳过的按钮,开机重启也无法直接跳过这个步骤,所以我们要通过特殊方式避过这个环节。大家可以先尝试使用之前文章的方法:1、 按下Alt+F4或者Fn+Alt+F4组合键,直接关闭窗口(很多机型都无反应,不过操作......
  • Pandas 学习手册中文第二版:11~15
    原文:Learningpandas协议:CCBY-NC-SA4.0译者:飞龙十一、合并,连接和重塑数据数据通常被建模为一组实体,相关值的逻辑结构由名称(属性/变量)引用,并具有按行组织的多个样本或实例。实体往往代表现实世界中的事物,例如一个人,或者在物联网中,是一个传感器。然后,使用单个数据帧对每个......
  • 11函数入门
    函数入门函数的作用函数就是将一段具有独立功能的代码块整合到一个整体并命名在需要的位置调用这个名称即可完成对应的需求。作用:封装代码,实现代码重用,减少内存空间,方便代码的管理和维护函数的使用定义函数def函数名称(参数):代码1代码2......retu......
  • 笨办法学 Python · 续 练习 11:`uniq`
    练习11:uniq原文:Exercise11:uniq译者:飞龙协议:CCBY-NC-SA4.0自豪地采用谷歌翻译在最后两个练习的开始,没有什么可说的了。你应该知道如何思考你的工作环境,你如何开始,你如何坐下来,影响你开始的任何事情。你也应该使用这些小小的45分钟的项目,突破了起始状态。如果你还没有弄清楚......
  • 力扣1127(MySQL)-用户购买平台(困难)
    题目:支出表:Spending这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端(‘desktop’)和手机端(‘mobile’)的应用程序。这张表的主键是(user_id,spend_date,platform)。平台列platform是一种ENUM,类型为(‘desktop’,‘mobile’)。问题写一段SQL......
  • 华普物联RS232/RS485串口转以太网/CAT1 DTU HP- ERSCAT-T211
    产品概述HP-ERSCAT-T211采用成熟的高性能工业处理器ARM926E],主频为300MHZ:采用宽电压DC/DC方案,提供DC9~48V超宽压电源输入并支持交流供电RS232/RS485接口,支持纯硬件定时看门狗,适合无人值守7X24小时运行的应用环境。定制化一体服务公司介绍公司简介深圳华普物联科技是......
  • 力扣1126(MySQL)-查询活跃业务(中等)
    题目:事件表:Events此表的主键是(business_id,event_type)。表中的每一行记录了某种类型的事件在某些业务中多次发生的信息。问题写一段SQL来查询所有活跃的业务。如果一个业务的某个事件类型的发生次数大于此事件类型在所有业务中的平均发生次数,并且该业务至少有两个这样......
  • 力扣1132(MySQL)-报告的记录Ⅱ(中等)
    题目:编写一段SQL来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后2位。Actions表: Removals表:Result表:2019-07-04的垃圾广告移除率是50%,因为有两张帖子被报告为垃圾广告,但只有一个得到移除。2019-07-02的垃圾广告移除率是100%,因......
  • 读取Excel表格数据做接口自动化测试并回写执行结果(待完善更新)11
    读取Excel表格数据做接口自动化测试并回写执行结果(待完善)待测试接口:代码脚本:控制台日志:执行结果:后续待完善:Excel表格增加请求方式(常用方式POST/GET/PUT)列;根据Excel表格内容(请求头Header、请求参数Parameter、请求体Body)发起请求;根据Excel表格内容(期望响应码、期望响应内容)与实际响......
  • NumPy 秘籍中文第二版:11~12
    原文:NumPyCookbook-SecondEdition协议:CCBY-NC-SA4.0译者:飞龙十一、最新最强的NumPy在本章中,我们涵盖以下秘籍:用at()方法用花式索引代替ufuncs通过使用partition()函数选择快速中位数进行部分排序使用nanmean(),nanvar()和nanstd()函数跳过NaN使用full()和full_......