关于hash join的原理的疑惑

[复制链接]
查看11 | 回复9 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
hash join原理介绍
http://www.itpub.net/315494.html
[B]
二.
Hash Join原理
我们用一个例子来解释Hash Join算法的原理,以及上述所提到的术语。
考虑以下两个数据集。
S={1,1,1,3,3,4,4,4,4,5,8,8,8,8,10}
B={0,0,1,1,1,1,2,2,2,2,2,2,3,8,9,9,9,10,10,11}
Hash Join的第一步就是判定小表(即build input)是否能完全存放在hash area内存中。如果能完全存放在内存中,则在内存中建立hash table,这是最简单的hash join。
如果不能全部存放在内存中,则build input必须分区。分区的个数叫做fan-out。Fan-out是由hash_area_size和cluster size来决定的。其中cluster size等于db_block_size * hash_multiblock_io_count,hash_multiblock_io_count在oracle9i中是隐含参数。这里需要注意的是fan-out并不是build input的大小/hash_ara_size,也就是说oracle决定的分区大小有可能还是不能完全存放在hash area内存中。大的fan-out导致许多小的分区,影响性能,而小的fan-out导致少数的大的分区,以至于每个分区不能全部存放在内存中,这也影响hash join的性能。
..............................
[/B]
但这样的原理介绍是hash join实现的介绍,是而且跟Oracle数据库是绑定的,我现在想要知道的是如果抛开数据库,也就是说不管是oracle也好,sybase也好,hash join总有一个公共的原理的,只不过在不同的rdbms的实现方法不同而已,那么这个原理是什么呢?那位xd可以从纯粹从算法的角度来解析一下?
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
首先你是否理解什么是 hash算法?
如果理解了,ok,那什么都很简单了(如果不理解请搜索数据结构相关基础知识)
oracle 会根据 joinkeys 值计算出一个 hash值,这个hash 值对应了 该条记录在内存中的位置。则 当 另外一个表来 join 的时候,根据 joinkeys 可以算出在内存中的位置,然后去看是否有记录存在,如果hash 冲突比较少,很容易就join 成功或者失败了。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
根据 join keys 值计算出一个 hash 值
->
采用的hash函数是....?
这个hash 值对应了 该条记录在内存中的位置
-->
内存中的位置是指内存地址?还是...?
在session的pga内把?
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
关于hash
Oracle hash cluster技术也使用到了
你可以看看 “Export one on one " 的 table类型那一章中关于hash_cluster的使用,或许会有所帮助。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
struct _hashptr
{
hashval
rowidentifier *row
} hashptr;
struct _rowidentifier
{
rowid
_rowidentifier *nxtrow
}rowidentifier;
hashptr hashp[HASH_KEY_SIZE];
hashp[n]->row 指向第一条记录, 第一条记录指向第二条
然后用第二个表来找,我在我的C程序中是这样来根据文件RFN找文件的.
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
另外,hash函数的基本意义就是把一个 data 转化成一个 整数。
husthxd:
你好像也搞JAVA吧,也可以参考一下 Java中hsahcode的概念。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
hash函数我们当然不会知道是什么了,这个是 hashjoin 的关键!由于是不同内存大小,并且数据类型和分布未知,减少hash 冲突 是一个不容易的事情。
内存中的位置,是指地址,这个地址,是 processprivateaddress,当然是pga中,不会是sga中。sga也好,pga也好,在process 中都有相对应的虚拟地址,sga是事先分配好的一个地址段而已。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
oradebug call kgghash() i don't know how to
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
应当和cluster差不多.
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
最初由 d.c.b.a 发布
[B]struct _hashptr
{
hashval
rowidentifier *row
} hashptr;
struct _rowidentifier
{
rowid
_rowidentifier *nxtrow
}rowidentifier;
hashptr hashp[HASH_KEY_SIZE];
hashp[n]->row 指向第一条记录, 第一条记录指向第二条
然后用第二个表来找,我在我的C程序中是这样来根据文件RFN找文件的. [/B]

got it
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行