(十一) 数据库查询处理之连接(Join)
(十一) 数据库查询处理之连接(Join)
1. 连接操作的一个例子
把外层关系和内层关系中满足一定关系的属性值拼接成一个新的元组


一种现在仍然十分有用的优化思路Late Materialization
在匹配记录的时候先只复制join keys. 对于上面的例子

这种机制非常适合列存储,因为DBMS不复制查询不需要的数据。剩下需要的元素则在连接之后在进行copy。
2. 连接算法
2.1 Nested Loop Join
2.1.1 Simple / Stupid
就是简单的二重循环暴力搜索。

可以非常简单的分析这个时间复杂度就是\(N_S \times N_R\)
2.1.2 Block

可以发现代码整体和上面的傻瓜版本差别并不大。但是可以让时间复杂度有一个显著提高。下面进行分析

主要的改进就是在这里。这里只需要一次磁盘访问。所以会显著的降低时间消耗。改进思想来自于缓冲区太小不能放下整个关系。但是可以放下一个块的关系。
如果我们有B个buffer可以用
对于R有M个Pages、m个tuples。S有N个Pages、n个tuples。

由于可以用B - 2 个buffer来sacn 关系R所以时间复杂度就可以减少非常多。因为我们把m个关系R中的tuple读到内存中只需要
\(M/(B - 2)\) 次。
2.1.2 Index
如果利用索引的话。我门就可以避免顺序查找了。

对于外层循环中的每一个元素。我们利用索引在内层关系中进行查找。假设索引所带来的消耗为C
所以总的时间就变成了\(M + (m \times C)\)
2.2 Sort - Merge - Join
又称为sort - merge -join算法。其大抵思想可以参考双指针算法

具体例子如下

然后就是经典的双指针匹配问题了
R: 100、200、300、400、500、600、700
S :100、100、200、400、500
如果匹配就输出。并且内层关系的指针向下移动。

如果不匹配外层关系的指针向下移动


以此类推就可以完成join操作。想一想归并排序就是这样做的。
复杂度分析
由两部分组成。一部分是排序的消耗另一部分就是merge的消耗

2.3 Hash Join
1. 基本的hash连接算法
- 建立对于关系R的hash表

在该hash表上进行probe
如果在关系S中的id拥有和关系R中id一样的值。那么他们利用相同的hash函数进行映射之后。就必然会去到相同的桶内。

2. Probe 阶段的优化
可以创建Bloom Filter进行优化。
何谓Bloom Filter
Bloom-Filter,即布隆过滤器,是一种多哈希函数映射的快速查找算法。通常应用在一些需要快速检测一个元素是否在一个集合中,但是并不严格要求100%正确的场合。Bloom Filter的空间利用效率很高,使用位数组表示一个待检测集合,使用它可以大大节省存储空间。利用这个算法我们可以实现去重效果。
Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元素不在集合,那肯定不在。如果判断元素存在集合中,有一定的概率判断错误(不在的一定不在,在的不一定在)。
看一个例子。如果我们存入baidu

Ok,我们现在再存一个值 “tencent”,如果哈希函数返回 3、4、8 的话,图继续变为:

加入我们现在查询alibaba。它经过哈希函数如果返回3、7、8我们会发现这三个位全为1.这样如果我们就会认为alibaba已经存在了。所以这也就是Bloom Filter不保证完全正确的原因。
引入Bloom Filter之后我们可以在探测之前先利用它进行判断。

3. GRACE HASH JOIN
适合于内存比较小的情况

从头进行比较。如果相同则进行join
如果某一个桶内的元素太多。内存中无法放下。则进行递归分块。利用不同的hash函数进行rehash

时间复杂度分析

(十一) 数据库查询处理之连接(Join)的更多相关文章
- 005.Oracle数据库 , 查询多字段连接合并,并添加文本内容
/*Oracle数据库查询日期在两者之间*/ SELECT PKID , OCCUR_DATE, PKID || ' 曾经沧海难为水 ' ||TO_CHAR( OCCUR_DATE, ' yyyy/m ...
- 004.Oracle数据库 , 查询多字段连接合并
/*Oracle数据库查询日期在两者之间*/ SELECT PKID , OCCUR_DATE, PKID || TO_CHAR( OCCUR_DATE, ' yyyy/mm/dd hh24:mi:s ...
- 数据库(学习整理)----7--Oracle多表查询,三种join连接
聚合函数:(都会忽略null数据) 常用的有5种:将字段中所有的数据聚合在一条中 .sum(字段名) :求总和 .avg(字段名) :求平均值 .max(字段名) :求最大值 .min(字段名) :求 ...
- 走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图
一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...
- 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16 过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...
- 数据库中的左连接(left join)和右连接(right join)区别
Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...
- SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)
SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...
- Orcla 数据库复习2 --子查询和表连接
子查询和表连接 ①.查询挣钱最多的人的名字 SELECT ename,sal FROM emp WHERE sal=(SELECT MAX(sal) FROM emp); ②.查询有哪些人的工 ...
- C#连接Oracle数据库查询数据
C#连接Oracle数据库可以实现许多我们需要的功能,下面介绍的是C#连接Oracle数据库查询数据的方法,如果您对C#连接Oracle数据库方面感兴趣的话,不妨一看. using System; u ...
随机推荐
- java的volatile关键字(笔记)
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...
- Java复习整理 Day02
1 package demo01; 2 3 import java.util.Scanner; 4 5 public class ScannerDemo01 { 6 public static voi ...
- POJ 1743 Musical Theme【SAM】
POJ1743 Musical Theme 要找长度\(\ge 5\)且出现次数\(\ge 2\)并且第一次出现和最后一次出现不重叠的最长子串. 题目条件中,如果对于两个串,在一个串的每个数上都加上相 ...
- 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)
题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...
- poj1821 Fence(dp,单调队列优化)
题意: 由k(1 <= K <= 100)个工人组成的团队应油漆围墙,其中包含N(1 <= N <= 16 000)个从左到右从1到N编号的木板.每个工人i(1 <= i ...
- hdu3247Resource Archiver (AC自动机+最短路+状压dp)
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Submis ...
- python的@是什么(函数装饰器)
可以看菜鸟教程:https://www.runoob.com/w3cnote/python-func-decorators.html 还有一个实例:https://zhuanlan.zhihu.com ...
- 吉哥系列故事——完美队形II(马拉车算法)
吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求 ...
- Educational Codeforces Round 89 (Rated for Div. 2) A Shovels and Swords B、Shuffle
题目链接:A.Shovels and Swords 题意: 你需要一个木棍和两个钻石可以造出来一把剑 你需要两个木棍和一个钻石可以造出来一把铁锹 你现在有a个木棍,b个钻石,问你最多可以造出来几件东西 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛. A.Easy Equation (前缀和/差分)
题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数. 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个 ...