哈希游戏- 哈希游戏平台- 哈希游戏官方网站
14.对于每一对儿Sn 和Bn,它们之中记录数较少的会被当作驱动结果集,然后 Oracle 会用这个驱动结果集的 Hash Bucket 里记录的 hash_value_2 来构建新的 Hash T able,另外一个记录数较大的会被当作被驱动结果集,然后Oracle会用这个被驱动结果集的Hash Bucket 里记录的 hash_value_2 去上述构建的新 Hash Table 中找匹配记录;注意,对每一对儿 Sn 和 Bn 而言,Oracle 始终会选择它们中记录数较少的来作为驱动结果集,所以每一对儿 Sn 和 Bn 的驱动结果集都可能会发生变化,这就是所谓的“动态角色互换”;
10.Oracle 会遍历 B,读取 B 中的每一条记录,并对 B 中的每一条记录按照该记录在表 T2 中的连接列做哈希运算,这个哈希运算和步骤3中的哈希运算是一模一样的,即这个哈希运算还是会用步骤3中的hash_func_1 和hash_func_2,并且也会计算出两个哈希值hash_value_1 和hash_value_2;接着 Oracle 会按照该记录所对应的哈希值 hash_value_1 去 Si 里找匹配的 Hash Bucket;如果能找到匹配的 Hash Bucket,则 Oracle 还会遍历该 Hash Bucket 中的每一条记录,并会校验存储于该 Hash Bucket 中的每一条记录的连接列,看是否是真的匹配(即这里要校验 S 和 B 中的匹配记录所对应的连接列是否真的相等,因为对于Hash 运算而言,不同的值经过哈希运算后的结果可能是一样的),如果是真的匹配,则上述 hash_value_1 所对应 B 中的记录的位于目标 SQL 中的查询列和该 Hash Bucket 中的匹配记录便会组合起来,一起作为满足目标SQL 连接条件的记录返回;如果找不到匹配的 Hash Bucket,则 Oracle 就会去访问步骤5中构建的位图,如果位图显示该 Hash Bucket 在 Si 中对应的记录数大于0,则说明该 Hash Bucket 虽然不在内存中,但它已经被写回到了磁盘上,则此时 Oracle就会按照上述 hash_value_1 的值把相应 B 中的对应记录也以Hash Partition 的方式写回到磁盘上,同时和该记录存储在一起的还有该记录用hash_func_2 计算出来的hash_value_2 的值;如果位图显示该 Hash Bucket 在 Si 中对应的记录数等于0,则 Oracle 就不用把上述 hash_value_1所对应 B 中的记录写回到磁盘上了,因为这条记录必然不满足目标SQL 的连接条件;这个根据位图来决定是否将上述 hash_value_1 所对应B中的记录写回到磁盘的动作就是所谓的
▪哈希连接的驱动表所对应的连接列的可选择性应尽可能的好,因为这个可选择性会影响对应Hash Bucket 中的记录数,而Hash Bucket 中的记录数又会直接影响从该 Hash Bucket 中查找匹配记录的效率;如果一个 Hash Bucket 里所包含的记录数过多,则可能会严重降低所对应哈希连接的执行效率,此时典型的表现就是该哈希连接执行了很长时间都没有结束,数据库所在database server 上的CPU