首页 > 编程语言 >cmu15545笔记-Join算法(Join Algorithms)

cmu15545笔记-Join算法(Join Algorithms)

时间:2024-11-15 14:58:09浏览次数:1  
标签:Sort Join Merge Cost Algorithms cmu15545 哈希 Hash

目录

Overview

输出形式:早物化与晚物化(OLAP一般都是晚物化)

代价分析:一般用IO次数计算(最终结果可能落盘,也可能不落盘,所以我们只计算输出结果之前的IO次数)。

Join左边称为外表(Outer Table),右边称为内表(Inner Join),外表一般是小表。

Nested Loop Join

Naïve

前提:缓冲区大小为3,一个外表输入,一个内表输入,一个输出。

基本思想:双重循环,对每一个元组(Tuple)进行配对,读取S表m次。

Cost:\(M+(m*N)\)

image image

Block

前提:缓冲区大小为3,一个外表输入,一个内表输入,一个输出。

基本思想:双重循环,对每一个块(Block,同页Page)内进行配对,所以读取S表M次。

Cost:\(M+(M*N)\)

image-20241115131544624

如果缓冲区容量为B,即可以容纳B个块(页),B-2个块用于外表输入,一个块用于内表输入,一个块用于输出。

Cost:\(M+(⌈M/(B-2)⌉*N)\)

Index

前提:缓冲区大小为3,一个外表输入,一个内表输入,一个输出。

基本思想:如果外部表有索引,那么内层循环无需遍历,查询索引即可。

Cost:\(M+(m*C)\)

image-20241115132426075

Sort-Merge Join

基本思想:排序后的序列更容易找到匹配项。

分为两个步骤:

  1. 排序:用任意排序方式,将R和S排序。
  2. 合并:移动两个指针寻找匹配项,过程中可能需要回退指针。

这两个步骤和上一节提到的外部归并排序思想相同,但不是同一个东西。

SortCost(R):\(2M*(1 + ⌈ log_{B-1} ⌈M / B⌉ ⌉)\)

SortCost(S):\(2N*(1 + ⌈ log_{B-1} ⌈N / B⌉ ⌉)\)

MergeCost:\(M+N\)

Total Cost:Sort + Merge

当R中存的是相同元素,且S中也是时,指针需要一直回退,Sort-Merge Join退化为Nest Loop Join。

image-20241115140700767

image-20241115141209698

Hash Join

Simple Hash Join

基本思想:匹配项会被映射到同一个哈希桶。

分为两步骤:

  1. 构建哈希表:对R表采用哈希函数\(h_1\)进行哈希,得到哈希表,包含不同的哈希桶(可以采用不同的哈希表,但是链式哈希最符合需求)。
  2. 探测:把S表元组用哈希函数\(h_1\)进行哈希,得到对应的哈希桶位置,然后在哈希桶中寻找匹配项。

image-20241115142931397

优化措施:布隆过滤器。

创建哈希表时顺带构建布隆过滤器,探测阶段先走布隆过滤器再走哈希桶。

image image

存在的问题i:该算法需要保证哈希表能存在内存中,如果哈希表太大导致无法存到内存中,需要不断地换入换出,影响效率。但不幸的是,大部分情况下,我们都不能保证内存能完全存下哈希表。

Partition Hash Join

基本思想:把两个表分别用同一个哈希函数哈希,相同哈希桶之间进行配对,如果哈希桶都存不下,就再哈希一次,直到能存下为止。

image-20241115144711876

读取对应的哈希桶到内存中配对即可。

Partition Cost:\(2(M+N)\) 【读取数据+哈希桶落盘(哈希空间复杂度为\(O(n)\))】

Probe Cost:\(M+N\)

Total Cost:\(3(M+N)\)

总结

Algorithm IO Cost Example
Naïve Nested Loop Join \(M + (m \cdot N)\) 1.3 hours
Block Nested Loop Join $ M + (\lceil \frac{M}{B-2} \rceil \cdot N)$ 0.55 seconds
Index Nested Loop Join \(M + (m \cdot C)\) Variable
Sort-Merge Join $ M + N + (\text{sort cost})$ 0.75 seconds
Hash Join \(3 \cdot (M + N)\) 0.45 seconds

结论:选择Partition Hash Join,出现下述情况时使用Sort-Merge Join:

  • 数据偏斜严重:Hash Join退化为Sort-Merge Join

  • 数据本身需要被排序:此时Sort-Merge Join只需要额外付出 \(M+N\) 即可实现Join

一般数据库中,Hash Join和Sort-Merge Join都会实现。

标签:Sort,Join,Merge,Cost,Algorithms,cmu15545,哈希,Hash
From: https://www.cnblogs.com/timothy020/p/18548006

相关文章

  • cmu15545笔记-排序和聚合算法(Sorting&Aggregation Algorithms)
    目录概述排序堆排序外部归并排序使用索引聚合操作排序聚合哈希聚合概述本节和下一节讨论具体的操作算子,包括排序,聚合,Join等。排序为什么需要排序操作:关系型数据库是无序的,但是使用时往往需要顺序数据(OrderedBy,GroupBy,Distinct)。主要矛盾:磁盘很大:要排序的数据集很大,内......
  • cmu15545-索引并发控制(Concurrent Indexes)
    目录OverviewLock和Latch辨析设计目标大致分类HashTableLatchesPageLatchesSlotLatchesB+TreeLatches并发问题LatchCrabbing/CoupingOptimisticCoupling(乐观锁)LeafNodeScanOverviewLock和Latch辨析Lock:抽象的,逻辑的,整体统筹Latch:具体的,原语性的,自我管理本节主要探......
  • 多源异构数据源融合怎么做?Join操作篇(2)
    在探讨多源异构数据融合的过程中,除了上篇介绍的通过Union方式实现的数据整合之外,Join操作同样是一种非常重要的手段。如果说Union是从横向角度将不同来源但结构相似的数据集合起来的话,那么Join则是从纵向的角度出发,基于特定条件将来自不同源头且可能存在关联关系的数据表连接起来,......
  • cmu15545-数据访问方式:B+树(B+Tree)
    目录基本概念基于磁盘的B+树查询与索引设计选择结点大小(NodeSize)合并阈值(MergeThredshold)变长键(Variable-lengthKeys)结点内部搜索(Intra-NodeSearch)优化手段PointerSwizzlingBε-treesBulkInsertPrefixCompressionDeduplicationSuffixTruncation基本概念基于磁盘的B+树......
  • Oracle/DM:LEFT OUTER JOIN排除数据(代替:not in)
    为了使用LEFTOUTERJOIN来排除表1中那些id在表2中有匹配的记录,我们可以按照以下步骤进行操作:数据表:表1(table1):idname112234表2(table2):id12目标:我们希望排除table1中那些在table2中有匹配的id,即排除id=1和id=2的记......
  • 第四届算法、微芯片与网络应用国际会议(AMNA 2025) 2025 4th International Conference
    重要信息官网:https://ais.cn/u/vEbMBz......
  • cmu15545-哈希表(Hash Table)
    基本概念哈希和树一样,是数据库系统中用于访问数据的方法。空间复杂度:$O(n)$时间复杂度:$O(1)~O(n)$权衡:更大的哈希空间(碰撞减少),还是更少的哈希空间(碰撞处理)?哈希函数CRC-64(1975)MurmurHash(2008)GoogleCityHash(2011)FacebookXXHash(2012)【最常用】Goo......
  • LEFT JOIN和INNER JOIN 以及 FOR ALL ENTRIES IN
    【在写开发报表的时候,遇到多表取数,重温数据库里面的集中多表取数的方法。】        在ABAP开发中,JOIN、LEFTJOIN、INNERJOIN以及FORALLENTRIESIN是用于将两个或多个表中的数据结合起来的不同方法。以下是它们之间的主要区别和使用方法:JOIN:JOIN是一个通用的术语......
  • 第三十四讲:join语句怎么优化?
    第三十四讲:join语句怎么优化?简概:万年不变的开头​ 在上一篇文章中,我和你介绍了join语句的两种算法,分别是IndexNested-LoopJoin(NLJ)和BlockNested-LoopJoin(BNL)。我们发现在使用NLJ算法的时候,其实效果还是不错的,比通过应用层拆分成多个语句然后再拼接查询结果更方......
  • left join 出现重复on导致sql语句报错
    leftjoin出现重复on导致sql语句报错​mybatis-plus开启多租户插件功能时,在进行链表查询时会重复出现on导致sql语句报错原因​原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器​分页拆件......