【CMU15-445 Part-11】Join Algorithms

Part11-Join Algorithms

Why Do We Need to Join?

Join其实是关系数据库和范式化表时候所产生的副产物。

也就是说我们范式化表是为了减少冗余信息,而我们使用join就是为了去重建reconstruct 这些原本的tuple

Join Algorithms

主要关注两表的inner equijoin algorithms

通常,较小的表作为左表(left table / outer table)进行join,右表叫做inner table

Join Operators

在叶子节点处对表访问,将表中的tuple作为输入传给父节点的operator。

Untitled

考虑1. output 查询计划生成树join算子之间传递的是什么 2. 如何判断算法的优劣——Cost Analysis Criteria

  1. 对于两个表R,S的tuple r,s进行join 级联操作,生成一个新的tuple,具体的内容取决于

    1. 查询处理模型 Query processing model (多个tuple)
    2. 存储模型 Storage model ,row / column 存
    3. 具体的query

    关于算子之间的输出传递,可以直接级联的结果进行传递,如果很多列则代价很大,可能进行一个预先的投影操作。还有就是only copy joins keys along with record ids.(特别针对列存) 叫做Late Materialization

    Untitled

  2. I/O Cost Analysis

    计算join过程必须使用的I/O次数来估计成本。只关心join操作的成本,不关心最后输出结果或者其他因素。

    M pages in table Rm tuples in R
    N pages in table Sn tuples in S

Join VS Cross-Product

cross-product 交叉连接

Join Algorithms

包括Nested Loop Join、Sort-Merge join、Hash Join

Nested Loop Join

for each tuple r in R           // outer tablefor each tuple s in S:        // inner tableemit,if r and s match

Untitled

stupid ! Cost: M + m* N 左表M个pages,然后m个tuple每次都扫描一次右表N个pages,代价就是M+m*N

优化:

  1. 小表作为左表

  2. Block Nested Loop Join

    使用block、page,可以多个tuple一个block/page,让outer table的一个block中所有tuple 完成和inner table中所有tuple的join,再去取下一个inner table的block。

    Untitled

    代价是:M+M*N,这里的话小表就是page少的了 不是tuple少的

  3. 对于outer table使用尽可能多的内存buffer来保存他,即B-2个block 来保存左表,1 block for inner table, 1 block for output result。

    Cost = M + [M / (B-2)] * N

    如果buffer够大可以放开左表,那cost = M+N

Untitled

  1. 可以避免循序扫描通过使用index来找inner table matches

    1. 使用一个已经存在的index on inner table
    2. build one on the fly(hash table, B+ Tree) 针对join的index 叫做Spooling index. 查询结束删除index

    Untitled

    index不一定就是join on的key,也许join on col A and B,在A上有index也可以用索引探针(Index probe)来进行优化,先找A然后再匹配B列。

    假设C是index查找一个tuple的一个代价,Cost = M + m*C

  2. Sort-Merge Join

    1. 第一阶段—排序:sort both tables on the join keys;可以使用external merge sort或者内存中的快排
    2. 第二阶段—合并:使用游标对排好序的两个表的tuple进行逐个比较,匹配就输出。双指针。

    Untitled

    可能会需要backtracking 回溯操作,回到该值在inner table中第一次出现的地方。只会对inner table进行backtracking。

    Cost =

    Untitled

    最差的情况:outer table中的每个值和inner table中的每个值都相等,每个tuple m都得回溯一次,COST = M * N + SORT COST

    Sort-Merge join 用处:如果有一个或者俩表都on join key排好序了;或者要求order by,需要对结果排序。特别有个索引排好序 且是聚簇索引

  3. Hash Join

    1. hash function是确定的,两个表相同的key hash 结果相同。

    2. 基于hash key来讲outer table拆分成多个分区,付出前期成本来将数据拆分以此让查找或者探测过程更快。即value hash → partition i,R tuple must be in r_i,S tuple must be in s_i。因此R tuples in r_i只需要和S tuples in s_i 比较来进行join

    3. Basic Hash Join Algorithm

      1. Build:循序扫描outer relation 然后pop到hashtable 使用h_1

      2. Probe:对inner relation扫描,使用h_1 将每个tuple进行hash处理;会跳到相同的位置然后看有没有匹配的tuple。

      3. Key:是join操作基于的属性;Value:取决于上层算子的输入。

        Untitled

      4. Hash Table Values

        1. Full Tuple:避免回表IO,但是需要更多内存。
        2. Tuple Identifier:tuple标识符例如record id,适用于列存,
    4. Probe Phase Optimization:再build阶段创建一个bloom filter,在没有查看hash table的情况下可以通过它来判断要查找的tuple是否在这个hashtable中。也叫做sizeways information passing横向信息传递。

      1. Bloom Filter:是一种概率数据结构(Probabilistic DS)(bitmap)用来处理set membership查询(近似成员查询:该key在不在我的集合中)包括操作:insert(x),Lookup(x).好处是可能会假阳性,就是实际不在但是告诉你在,但是不会逻辑上影响正确性,不会假阴性就是在但是告诉你不在,这样就是逻辑错误了这种不会出现。
      2. 具体的优化是构建hash table的时候可能会溢出到磁盘,为key构建一个bloom filter,super small can fit in memory。避免潜在的无用的磁盘I/O

      Untitled

    5. Grace(partition) Hash Join:处理Hash Join don’t fit in memory

      1. Build Phase:基于hash key将两张表拆分成多个分区,拆分成两个单独的hash table,outer table和inner table各自有一张hash table。
      2. Probe Phase:比较两张表对应分区的tuples,对匹配的分区进行nested-loop join。

      bucket chain hash table而非linear probe hash table。因为想要相同的数据hash到同一位置或者映射到同一分区。一一匹配去scan。

      Untitled

      都hash到一个bucket就会出问题,用递归分区Recursive Partitioning来解决。使用另外一个hash function h2来建立bucket_r,i。如果有足够buffer,且所有数据都能放在内存中,可以跨分区进行join操作,COST = 3 *(M+N)。分区的时候要对M outertable N innertable进行一轮读和一轮写,probe一轮

      Untitled

Observation

如果DBMS直到outer table的size可以去调整hash table或者buffer size,如果可以都内存就线性hash,如果需要溢出到磁盘就bucket。如果不知道size,可以使用动态hash table(linear extendable hash table)或者允许overflow pages,但是代价会很高。

Untitled

  1. 什么情况下会不清楚outer table的size? 回答:多个操作之间所产生的临时中间表的size

除非排好序,否则hash join永远比其他join来的好

sorting适合于non-uniform data 或者结果需要排序的情况。

range join anti join?

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

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

相关文章

01_网络编程_传统IO

网络编程 1.什么是网络编程 在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 如果想把一个计算的结果,或者是电脑上的文件通过网络传递给你的朋友,就需要用到网络编程。 在实际生活中,网络通信无处不在…

Windows 10 Enterprise LTSC 2021 (x86) - DVD (Chinese-Simplified)文件分享

Windows 10 Enterprise LTSC 2021 (x64) - DVD (Chinese-Simplified) SW_DVD9_WIN_ENT_LTSC_2021_64BIT_ChnSimp_MLF_X22-84402.ISO 镜像文件: 链接:https://pan.quark.cn/s/2f8f61ec4a98 Windows 10 Enterprise LTSC 2021 (x86) - DVD (Chinese-Simpli…

python selenium 爬虫教程

Python和Selenium是很强大的爬虫工具,可以用于自动化地模拟浏览器行为,从网页中提取数据。下面是一个简单的使用Python和Selenium进行爬虫的案例。 入门: 1. 安装和配置: 首先,你需要安装Python和Selenium。可以使用…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API: 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest,在发起请求前的预执行逻辑,通常是生成一些动态变量值 测试用例模块 测试者…

开源社区赋能,Walrus 用户体验再升级

基于平台工程理念的应用管理平台 Walrus 已于上月正式开源,目前在 GitHub 已收获 177 颗星🌟 Walrus 希望打造简洁清爽的应用部署与管理体验,帮助研发与运维团队减少“内耗”工作,提升开发体验。 我们十分重视 Walrus 用户的…

Ubuntu安装深度学习环境相关(yolov8-python部署)

Ubuntu安装深度学习环境相关(yolov8-python部署) 本文将从如下几个方面总结相关的工作过程: Ubuntu系统安装(联想小新pro16) 2.显卡驱动安装3.测试深度学习模型 1. Ubunut 系统安装 之前在台式机上安装过Ubuntu,以为再在笔记本上安装会是小菜一碟&…

查询IP地址可得到哪些信息

通过IP地址定位,可以获取一些基本的信息,包括以下内容: 1. 地理位置:你可以确定IP地址所在的地理位置,包括国家、州或省、城市和地理坐标。这通常是通过将IP地址与地理位置数据库进行匹配来实现的。 2. ISP&#xff…

JDK13特性

文章目录 JAVA13概述语法层面特性switch表达式(预览)文本块(预览) API层次特性重新实现旧版套接字API 其他变化ZGC取消未使用的内存增加废弃和移除增加项移除项废弃项 JAVA13概述 2019年9月17日,国际知名的OpenJDK开源社区发布了Java编程语言环境的最新版本OpenJDK…

【资源监视器】设备占用,强制弹出移动硬盘

设备占用,强制弹出移动硬盘 任务管理器中找到资源监视器 资源监视器:找到CPU 输入磁盘:如H: , 点击旁边的刷新 结束句柄 右键

简单工厂模式 和 工厂方法 和 抽象工厂的区别

简单工厂模式、工厂方法模式和抽象工厂模式是三种不同的创建型设计模式,它们在对象的创建和封装方面有不同的用途和实现方式。以下是它们之间的主要区别: 1. **简单工厂模式(Simple Factory Pattern)**: - **目的**&a…

二十一、MySQL(多表)内连接、外连接、自连接实现

1、多表查询 (1)基础概念: (2)多表查询的分类: 2、内连接 (1)基础概念: (2)隐式内连接: 基础语法: select 表1.name,…

私域流量的优势

私域流量是指由自身品牌或个人拥有并具备完全掌控权的流量资源。它相比于传统的广告推广,拥有独特的优势。 首先,私域流量能够更加精准地定位目标用户,实现精准传播。不再盲目投放广告,而是通过建立自身社群、粉丝群,获…

xshell---git上传文件到gitee远程仓库配置

1.git下载 如果没有xshell下没有下载过git,可以参考这篇的教程:Linux配置安装 git 详细教程 下载后可以通过 git --version 查看git的版本号,验证是否安装成功 2.新建仓库 首先需要在gitee上注册一个账号 然后再主页面点击右上边框的 号…

7.从句学习

目录 一、从句。 (1) 从句总结。 (2)从句类型。 (3)引导词(常见的引导词)。 (3.1)名词性从句: (3.2)形容词性从句&a…

Springboot 实践(17)spring boot整合Nacos配置中心

前文我们讲解了Nacos服务端的下载安装,本文我们降价spring boot整合nacos,实现Nacos服务器配置参数的访问。 一、启动Nacos服务,创建三个配置文件,如下所示 Springboot-Nacos-Client-dev.yaml文件配置参数 Springboot-Nacos-Clie…

jitsi音视频会议集成到自己的网页中

将jitsi视频会议集成到自己的web网站&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><meta name"viewport" content&…

算法训练 第二周

二、反转链表 本题给我们了一个单链表的头节点head&#xff0c;要求我们把这个单链表的连接顺序进行逆置&#xff0c;并返回逆置后的链表头节点。 1.头插法 我们需要先创建一个新的头节点ph&#xff0c;然后遍历给出的单链表&#xff0c;把遍历到的每一个节点用头插法接到ph的…

高德地图实现-微信小程序地图导航

效果图&#xff1a; 一、准备阶段 1、在高德开放平台注册成为开发者2、申请开发者密钥&#xff08;key&#xff09;。3、下载并解压高德地图微信小程序SDK 高德开放平台&#xff1a; 注册账号(https://lbs.amap.com/)) 申请小程序应用的 key 应用管理(https://console.ama…

Hadoop源码阅读(二):DataNode启动

说明&#xff1a; 1.Hadoop版本&#xff1a;3.1.3 2.阅读工具&#xff1a;IDEA 2023.1.2 3.源码获取&#xff1a;Index of /dist/hadoop/core/hadoop-3.1.3 (apache.org) 4.工程导入&#xff1a;下载源码之后得到 hadoop-3.1.3-src.tar.gz 压缩包&#xff0c;在当前目录打开Pow…

千里共婵娟 | 结合微信公众号用JavaScript完整开发实现换中秋头像的功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…