Oracle 表的连接方式(2)-----HASH JOIN的基本机制3
HASH JOIN的模式
hash join有三种工作模式,分别是optimal模式,onepass模式和multipass模式,分别在v$sysstat里面有对应的统计信息:
SQL> select name, value from v$sysstat where name like '%workarea executions%';
optimal模式
optimal模式就是从build table上获取的结果集比较小,可以把整个hash table都建立在用户可以使用的内存区域里。下面这张图就是用来描述optimal的hash join的:
optimal hash join大致上分为以下几步:
1. 首先利用做连接的列上的hash函数,把build table的结果集做成内存里的hash table,这里的hash bucket总是2的n次方,比如1024或4096。可以简单的把hash table看做内存里的一个大正方形,你面有很多小格子,而build table上的数据则是分散的分布在这些格子里面,而这些小格子就是hash bucket。
2. oracle开始读取probe table, 针对每一条数据都对做连接的列上使用hash函数,定位对应build table的相同值的hash bucket,找到相应的hash bucket后就到那个位置是去看有没有匹配的数据。这个过程叫做probing hash table。
3. 在检查bush bucket的时候,如果bucket里面没有数据,那么马上丢掉probe table的这一行。如果Bucket里面有数据,就要进一步检查里面的数据是否和proble table当前的这个数据匹配,这一步是很必要的。在我们前面介绍filter和hash cluster table的时候我们提过,hash函数存在一个冲突的问题,也就是不同的hash key完全有可能对应到相同的hash bucket里,所以当我们为probe table上的一个值定位到了一个hash bucket的时候,我们需要做进一步的检查,来看看这个bucket里面哪些数据是我们需要的,哪些数据是我们不需要的。 在理想的情况下,我们希望每一个hash bucket里面最多只有一个hash key的数据,因此往往hash bucket的个数是要比hash key的个数要多的。
onepass hash join模式
我们知道optimal hash join发生在我们可以把整个hash table全部放在内存里的时候,从而所有的join操作都可以在内存里面完成,这是我们最理想的模式。但是,当我们的内存无法放下整个hash table,我们就不得不在onepass模式下进行hash join。
1. 首先,由于内存无法放下所有的hash table内容,那么就会导致有的hash bucket放在内存里,有的hash bucket放在磁盘上,但不管放在哪里,Oracle使用一个bitmap结构来反应这些bucket的状态,包括位置和是否有数据在里面。
2. 当我们的probe table对连接的列使用hash函数之后,先到bitmap上看看对应的bucket是不是为空,而过为空,这条数据就丢掉不管。如果不为空,还要看现 在这个bucket是在内存里还是在磁盘上。如果是在内存里,就直接访问这个bucket并检查是否有数据匹配,如果有匹配就返回这条查询结果。第二种情 况是如果要访问的这个bucket在磁盘上,这时候如果直接去磁盘上访问显然cost很大,所以oracle的处理方法是先把这个probe的数据放到一 边不管。顺便一提的是这个probe的值首先是会放在内存里,如果以后积累了一定量的其他probe上的数据之后,oracle会把这些数据批量的写入到 磁盘,这就是图上的dump probe partitions to disk。
3. 当我们把probe完整的扫描了一边之后,我们可能已经返回了一部分匹配的数据,但是我们现在在磁盘还有两部分没有处理的数据:build table的hash table的一部分数据和probe table的一部分数据,现在oracle就把这两部分数据重新做一次hash join(这时候会重新比较谁的结果集比较小,因此可能会出现原来的build table变成probe table,原来的probe table变为build table),然后返回最终的查询结果。这就是onepass hash join的大致过程。
multipass hash join模式
最后,如果我们的内存特别小或者相对而言需要hash的数据特别大,hash join就会以最恶劣的方式执行:multipass hash join。如果说onepass是只需要多从磁盘做一次probe table的读取,那么multipass就需要做多次读取,这往往发生在可用内存和数据量相差很大的情况下。multipass hash join是我们需要尽量避免的东西
对HASH JOIN的一次优化:
http://www.cnblogs.com/killkill/archive/2010/07/22/1782889.html
--整理自网络
Oracle 表的连接方式(2)-----HASH JOIN的基本机制3的更多相关文章
- Oracle 表的连接方式(2)-----HASH JOIN的基本机制2
Hash算法原理 对于什么是Hash算法原理?这个问题有点难度,不是很好说清楚,来做一个比喻吧:我们有很多的小猪,每个的体重都不一样,假设体重分布比较平均(我们考虑到公斤级别),我们按照体重来分,划分 ...
- Oracle 表的连接方式(2)-----HASH JOIN的基本机制1
我们对hash join的常见误解,一般包括两个: 第一个误解:是我们经常以为hash join需要对两个做join的表都做全表扫描 第二个误解:是经常以为hash join会选择比较小的表做buil ...
- Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...
- Oracle 表的连接方式
1. 连接说明 ① Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表. ② 当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接:然后将中间结果与 ...
- 转:ORACLE的JDBC连接方式:OCI和THIN
oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...
- Oracle 三种连接方式 NESTED LOOP HASH JOIN SORT MERGE JOIN
NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大( ...
- oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。
今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...
- EF的表左连接方法Include和Join
在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同. 例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外 ...
- SQLAlchemy(2):多表操作 & 连接方式及原生SQL
一对多:ForeignKey multitb_models.py import datetime from sqlalchemy import create_engine # 引入 创建引擎 from ...
随机推荐
- 基于 SOA 的组件化业务基础平台
业务基础平台是业务逻辑应用和基础架构平台之间的一个中间层,解决 “应用软件的业务描述和操作系统平台.软件基础架构平台之间的交互与管理问题”.操作系统平台解决了“应用软件系统与硬件之间的交互与管理问题” ...
- 【阿里云产品公测】在Laravel4框架中使用阿里云OCS缓存
作者:阿里云用户 supechina Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借助 Facades 优雅的 IoC Cont ...
- 来TN公司两周的记录
刚好上两周班,现在记录一下吧. 第一周:全部是培训,关于系统的架构.BOSS.NGBOSS.编码规范.开发规范.项目文档等.听了之后对公司的技术还是有一定的了解.至少知道公司不只一个web站. 第二周 ...
- Linux_netstat 详解
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...
- Java Lock
JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的.在java.util.concurrent.locks包中有很多 ...
- Event Handling in Spring
Spring内置的event有 1.ContextRefreshedEvent This event is published when the ApplicationContext is eithe ...
- C#传递参数
与函数交换数据的最好方式就是传递参数,在C#中有四种方法来控制参数如何传递给目标方法 C#中的参数修饰符 无修饰 如果一个参数没有用参数修饰符,则认为它将按值传递 out 输出参数由被调用的方法赋值. ...
- cocos2dx注册场景 使用CCEditBox实现输入框
我们在开始玩一个游戏时,通常要做的第一件事就是注册账号,下面就让我们来制作一个简单的注册场景,我所使用的cocos2dx版本为2.2.2 在这个场景中最主要的元素就是输入框和按钮,我从网上找了一些素材 ...
- 20141201--测试 jQuery
测试 JavaScript 框架库 - jQuery jQuery 是一个 JavaScript 库. 引用 jQuery <!DOCTYPE html> <html> < ...
- Focus相关点滴
获取当前焦点所在的控件. .Net本身没有该API.必须使用Win32 API解决. internal static extern IntPtr GetFocus(); Control focused ...