日期:2014-05-16  浏览次数:20464 次

【Oracle优化笔记】哈希连接(HASH JOIN)详解

哈希连接(HASH JOIN)详细执行步骤如下所示:

1.Oracle根据HASH_AREA_SIZEDB_BLOCK_SIZE_HASH_MUTBLOCK_IO_COUNT的值来决定HASH Partition的数量(HASH PARTITION是将结果集分为若干个分区,每个分区有相同数量的bucketbuckethash映射的单位,而partition则是I/O单位)。Oracle会保留hash area20%来存储分区的头信息、hash位图信息和hash表。因此,这个数字的计算公式是:
     Partition=0.8*hash_area_size/(hash_multiblock_io_count*db_block_size)

各参数含义后边解释。

2.在表1和表2施加指定的谓词条件之后,结果集较小的那个作为驱动结果集,记为S,结果集较大的那个是被驱动结果集,记为B

3.oracle遍历S,一条条读取记录,并对连接列的值通过两个哈希算法进行哈希运算,得到两个值hash1hash2。然后根据hash1的值将S中对应的记录放到对应的hash partitionhash bucket之中,同时存储进去的还有hash2的值。如果在读取过程中hash area已经满了,那么oracle会选择记录量最大的hash partition写入到磁盘中(临时表空间),如果之后再有需要放到该partition的值,那么就会更新磁盘,如果频繁更新磁盘会导致性能问题。在构建hash partition时会同时构建一个BITMAP,记录该partition当中每个bucket是否为空。遍历完后