CMU 15-445 -- Join Algorithms - 09

news2024/11/23 21:46:07

CMU 15-445 -- Join Algorithms - 09

  • 引言
  • Join Algorithms
  • Join Operator Output
  • I/O Cost Analysis
  • Nested Loop Join
    • Simple Nested Loop Join
    • Block Nested Loop Join
    • Index Nested Loop Join
    • 小结
  • Sort-Merge Join
    • 小结:
  • Hash Join
    • Basic Hash Join Algorithm
    • Grace Hash Join
  • 小结


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。


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

以课程开始时的 table 为例,通过将 Artist 与 Album 之间的多对多关系拆成 Artist, ArtistAlbum 以及 Album 三个 tables 来规范化数据,使得数据存储的冗余减少:
在这里插入图片描述

查询时我们就需要通过 Join 来重建 Artist 与 Album 的完整关系数据。


Join Algorithms

本课主要讨论 join 两个 tables 的过程。首先需要讨论的是:

  • Join 的输出
  • Join 的成本分析

Join Operator Output

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

在这里插入图片描述
Join 操作的结果 tuple 中除了 Join Attributes 之外的信息与多个因素相关:

  • query processing model
  • storage model
  • query

我们可以在 Join 的时候将所有非 Join Attributes 都放入新的 tuple 中,这样 Join 之后的操作都不需要从 tables 中重新获取数据:

在这里插入图片描述
也可以在 Join 的时候只复制 Join Attributes 以及 record id,后续操作自行根据 record id 去 tables 中获取相关数据。对于列存储数据库,这是比较理想的处理方式,被称为 Late Materialization。


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

本节要介绍的 Join Algorithms 罗列如下:

  • Nested Loop Join
    • Simple
    • Block
    • Index
  • Sort-Merge Join
  • Hash Join

不同的 Join Algorithms 有各自的适用场景,需要具体问题具体分析。


Nested Loop Join

Simple Nested Loop Join

在这里插入图片描述
在这里插入图片描述
对 R 中的每个 tuple,都全表扫描一次 S,是一种暴力解法,它的成本为:

  • M + ( m * N )

举例:

假设:

  • M = 1000, m = 100,000
  • N = 500, n = 40,000

成本:

  • M+(m×N)=1000+(100000×500)=50000
  • 100 I/Os

假设 0.1 ms/IO,则总时长约为 1.3 小时。

如果我们使用小表 S 作为 Outer Table,那么:

  • N+(n×M)=500+(40000×1000)=40000,500 I/Os

则总时长约为 1.1 小时。

总结: 这个算法很差,因为对于R关系中每个元组,都需要把S关系遍历一遍。


Block Nested Loop Join

在这里插入图片描述

在这里插入图片描述
每次取 R 中一个 block 的所有 tuples 出来,让它们同时与 S 中的所有 tuples Join 一次,它的成本为:

  • M + ( M * N )

举例:

假设:

  • M = 1000, m = 100000
  • N = 500, n = 40000

成本:

使用大表 M 作为 Outer Table,成本为:

  • M+(M×N)=1000+(1000×500)=501000 I/Os

总共用时约 50 秒。

使用小表 S 作为 Outer Table,成本为:

  • N +(N×M)=500+(1000*500)=500500 I/Os

以上的计算都假设 DBMS 只为 Nested Loop Join Algorithm 分配 3 块 buffers,其中 2 块用于读入,1 块用于写出;若 DBMS 能为算法分配 B 块 buffers,则可以使用 B-2 块来读入 Outer Table,1 块用于读入 Inner Table,1 块用于写出,此时,成本为

  • M + ( ceil( M / ( B - 2 ) * N )

如果 Outer Table 能够直接放入内存中,则成本为 M + N。

总结: 这种算法会有较少的磁盘IO产生,因为对于关系R中每个block,会把关系S扫描一遍,同时在这种算法下,小表应该作为outer table,因为小表有更少的pages。


Index Nested Loop Join

之前的两种 Nested Loop Join 速度慢的原因在于,需要对 Inner Table 作多次全表扫描,若 Inner Table 在 Join Attributes 上有索引或者临时建一个索引 (只需全表扫描一次):

  • 若Inner Table在Join Attributes上有索引或者建立了临时索引,则可以使用Index Nested Loop Join(索引嵌套循环连接)来加速查询。这种方法利用了索引快速定位到Inner Table的匹配行,而不需要多次进行全表扫描,从而提高查询效率。

  • 在Index Nested Loop Join中,外部表通过嵌套循环的方式遍历内部表,并使用内部表上的索引查找匹配行。当外部表上的一行与内部表上的一行匹配时,将它们联接起来形成结果集。

在这里插入图片描述
在这里插入图片描述
此时 Join 的成本为:

  • M + ( m * C )

其中 C 为 index probe 的成本。


小结

从上面的讨论中,我们可以导出以下几个结论:

  • 总是选择小表作为 Outer Table
  • 尽量多地将 Outer Table 缓存在内存中
  • 扫描 Inner Table 时,尽量使用索引

Sort-Merge Join

Sort-Merge Join 顾名思义,分为两个阶段:

  • Phase #1: Sort
    • 根据 Join Keys 对 tables 进行排序
    • 可以使用外部归并排序
  • Phase #2: Merge
    • 同时从两个 tables 的一端开始扫描,对 tuples 配对
    • 如果 Join Keys 并不唯一,则有可能需要 backtrack

算法如下:
在这里插入图片描述
在这里插入图片描述

Sort Merge的成本分析如下:

  • Sort Cost ( R ) : 2M * (logM / logB)
  • Sort Cost ( S ) : 2N * (logN / logB)
  • Merge Cost: M + N

举例:

假设:

  • M = 1000, m = 100,000
  • N = 500, n = 40,000
  • B = 100
  • 0.1ms/IO

成本:

  • Sort Cost( R ) : 2000 * (log 1000 / log 100) = 3000 I/Os
  • Sort Cost( S ) : 1000 * (log 1000 / log 100) = 1350 I/Os
  • Merge Cost: 1000 + 500 = 1500 I/Os
  • Total Cost = 3000 + 1350 + 1500 =5850 I/Os
  • Total Time = 0.59 secs

Sort-Merge Join 的最坏情况就是当两个 tables 中的所有 Join Keys 都只有一个值,这时候 Join 的成本变为:

  • M × N + sort cost

小结:

Sort-Merge Join 适用于:

  • 当 tables 中的一个或者两个都已经按 Join Key 排好序,如聚簇索引
  • SQL 的输出必须按 Join Key 排好序

Hash Join

核心思想:

  • 如果分别来自 R 和 S 中的两个 tuples 满足 Join 的条件,它们的 Join Attributes 必然相等,那么它们的 Join Attributes 经过某个 hash function 得到的值也必然相等,因此 Join 的时候,我们只需要对两个 tables 中 hash 到同样值的 tuples 分别执行 Join 操作即可。

Basic Hash Join Algorithm

本算法分为两个阶段:

  • Phase #1: Build
    • 扫描 Outer Table,使用 hash function h1 对 Join Attributes 建立 hash table T
  • Phase #2: Probe
    • 扫描 Inner Table,使用 hash function h1 获取每个 tuple 在 T 中的位置,在该位置上找到配对成功的 tuple(s)

在这里插入图片描述
这里明确 T 的定义:

  • Key:Join Attributes
  • Value:根据不同的查询要求及实现来变化
    • Full Tuple:可以避免在后续操作中再次获取数据,但需要占用更多的空间
    • Tuple Identifier:是列存储数据库的理想选择,占用最少的空间,但之后需要重新获取数据

但 Basic Hash Join Algorithm 有一个弱点,就是有可能 T 无法被放进内存中,由于 hash table 的查询一般都是随机查询,因此在 Probe 阶段,T 可能在 memory 与 disk 中来回移动。


Grace Hash Join

当两个 table 都无法放入 memory 时,我们可以:

  • Phase #1: Build
    • 将两个 tables 使用同样的 hash function 进行 partition,使得可能配对成功的 tuples 进入到相同的Partition
  • Phase #2: Prob
    • 对两个 tables 的每一对 partition 分别进行 Join

在这里插入图片描述
如果每个 partition 仍然无法放入内存中,则可以递归地使用不同的 hash function 进行 partition,即 recursive partitioning:

  • Build another hash table for bucketR,i using hash function h2 (with h2≠h1).
  • Then probe it for each tuple of the other table’s bucket at that level.

probe: 探测

在这里插入图片描述
成本分析:

假设我们有足够的 buffers 能够存下中间结果:

  • Partitioning Phase:
    • Read + Write both tables
    • 2(M+N) I/Os
  • Probing Phase
    • Read both tables
    • M+N I/Os

举例:

假设:

  • M = 1000, m = 100000
  • N = 500, n = 40,000
  • 0.1ms/IO

计算:

  • 3×(M+N)=4,500 I/Os
  • 0.45 secs

如果 DBMS 已经知道 tables 大小,则可以使用 static hash table,否则需要使用 dynamic hash table


小结

AlgorithmIO CostExample
Simple Nested Loop JoinM+(m×N)1.3 hours
Block Nested Loop JoinM+(M×N)50 secs
Index Nested Loop JoinM+(m×C)20 secs
Sort-Merge JoinM+N+(sort cost)0.59 secs
Hash Join3(M+N)0.45 secs

Hash Join 在绝大多数场景下是最优选择,但当查询包含 ORDER BY 或者数据极其不均匀的情况下,Sort-Merge Join 会是更好的选择,DBMSs 在执行查询时,可能使用其中的一种到两种方法。

本节对应教材PDF

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

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

相关文章

如何获取铁粉

忽然发现我的铁粉从100变成了540,分享下我的经验,我觉得可能是我的机器人经常互动的问题,结合自己的看法和平台大佬的想法一些进行了梳理: 在当今社交媒体时代,吸引和保留铁粉(忠实粉丝)对于个…

Robocom2021 初赛

收录一下Robocom初赛的屌题&#xff0c;调了我一个多小时&#xff0c;是我菜了 题目详情 - 7-3 打怪升级 (pintia.cn) 题意&#xff1a; Code&#xff1a; #include<bits/stdc.h> using namespace std;int n, m, a, b, c, d, q, p; int f[1005][1005];const int N 2…

Vector - CANoe - 测试报告设置

file:///C:/Program%20Files/Vector%20CANoe%2015/Help01/CANoeCANalyzerHTML5/CANoeCANalyzer.htm#Topics/CANoeCANalyzer/Windows/TestConfigurations/TCConfigTC.htm 前面有过介绍&#xff0c;我们常用的测试报告还是以XML/HTML格式来生成测试报告&#xff0c;而对于XML/HTM…

【洛谷】P1342 请柬(正反建图+dijkstra)

1&#xff1a;思考&#xff1a; 从1到所用顶点简单&#xff08;单源最短路径。&#xff09;&#xff0c;重点在怎么解决所用点到1&#xff08;单终点最短路径&#xff09; 答案&#xff1a;反向建图使&#xff08;单终点最短路径→单源最短路径。&#xff09; 复杂度&#xf…

基于SpringBoot的网上订餐系统【附ppt和开题|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&#xff1a;菜品分类、菜品名称查询、食材查询、菜品详情、下单提交 ③个人中心&#xff1a;可以查看自己的信息、我的订单、我的地址 后台登录&#…

【杨氏矩阵】

这篇文章的对应思维导图为&#xff1a;思维导图 思维导图对应代码&#xff1a; //杨氏矩阵 #include<stdio.h>//void ysjz1(int a[3][3],int k) { // int x 0; // int y 2; // while (x < 2 && y > 0) { // if (a[x][y] > k) { // y--; // } // …

算法训练营第三十六天||● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 解法1&#xff1a; 本题其实和452.用最少数量的箭引爆气球 (opens new window)非常像&#xff0c;弓箭的数量就相当于是非交叉区间的数量&#xff0c;只要把弓箭那道题目代码里射爆气球的判断条件加个等号&#xff08;认为[0&#xff0c;1][1&#xff0c;…

【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息

Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类&#xff0c;例如代表低级网络概念的 QTcpSocket&#xff0c;QTcpServer 和 QUdpSocket&#xff0c;以及诸如 QNetworkRequest&#xff0c; QNetworkReply 和 QNetworkAccessManager 之类的高级类来…

2023世界人工智能大会,和鲸科技入选中国信通院《2023大模型和AIGC产业图谱》

近日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代 AIGC 新浪潮”论坛上&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;正式发布《2023 大模型和AIGC产业图谱》&#xff08;以下称“图谱”&#xff09;。和…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

springboot项目实战-API接口限流

1.简介 对接口限流的目的是通过对并发访问/请求进行限速&#xff0c;或者对一个时间窗口内的请求进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。 1.1.为什么需要限流? 大量正常用户高频访问导致服务器宕机恶意用户高频访问导致服…

国产SAAS平台中类似Jira的有哪些值得关注的选择?

在项目管理市场中&#xff0c;Jira是一款非常知名的软件工具。它可以帮助团队成员更好地管理和协作&#xff0c;提高项目效率和质量。然而&#xff0c;Jira并不是完美的&#xff0c;存在诸如复杂操作、高昂费用等不足之处。因此&#xff0c;许多国内企业开始尝试寻找替代品&…

Yolov7配置CoCo精度显示问题实操

1、安装pycocotools工具&#xff0c; 使用yolov7项目中test.py&#xff0c;安装pycocotools时&#xff0c;命令无法直接安装成功。 本次操作在Linux上进行&#xff1a; GitHub - cocodataset/cocoapi: COCO API - Dataset http://cocodataset.org/COCO API - Dataset http:…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明&#xff1a; https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明&#xff1a; 1. 打包安卓&#xff0c;只选择安卓打包项&…

【Pytest】Allure测试报告的安装与环境配置

文章目录 一、安装配置JAVA环境1、下载jdk2、配置环境变量3、检验 二、安装allure-pytest插件三、下载安装Allure1、下载allure2、配置环境变量3、检验 一、安装配置JAVA环境 Allure基于Java开发&#xff0c;因此需要提前安装Java 8 或以上版本的环境。 1、下载jdk jdk下载地…

2023愚人杯-easy_base

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 4C455A5645334C44474A55484D5A42544F5132574956525A50464E464F4E4C474D4656454D334359474A554751564B4949493255535532464E42544643504A350x02 Write Up 直接通过现成的工具即可&#xff1a; 以上

C++教程——STL

STL基本概念 容器算法迭代器 Vector容器 vector存放内置数据类型 vector存放自定义数据类型 vector容器嵌套容器 string容器 string的构造函数 string赋值操作 string字符串拼接 string查找与替换 string字符串比较 string字符存取 string插入与删除 string字串获取

React+Antd+Typescript:封装条件查询组件

文章目录 概要整体架构思路概要 这是筛选组件的效果图。一般使用场景,根据需求快速筛选出符合条件的数据。 那么这个筛选组件,就是默认一些常见的条件,比如明天或者昨天,虽然这个条件,我们可以通过antd的日期控件来实现,但缺点就是操作起来有点麻烦。通过预设一些条件,…

学习记录——BiSeNetV1、BiSeNetV2、BiSeNetV3、PIDNet

BiSeNetV1 BiSeNetV1为了在不影响速度的情况下&#xff0c;同时收集到空间信息和语义信息&#xff0c;设计了两条路&#xff1a; Spatial Path: 用了三层stride为 2 的卷积&#xff0c;卷积BNRELU模块。最后提取了相当于原图像 1/8 的输出特征图。由于它利用了较大尺度的特征图…

C++_简单模拟实现string的增删查改

目录 一、模拟reserve 二、模拟push_back 三、模拟append 四、模拟operator 五、模拟insert 六、模拟erase 七、模拟find 八、模拟substr 一、模拟reserve 要添加数据&#xff0c;首先要考虑的是扩容。有必要用reserve辅助扩容。reserve的作用就是给一个预期的值作为扩…