在进行HASH JOIN时什么是HASH TABLE?

时间:2012-11-03 17:57:10

标签: oracle query-optimization oracle9i

在oracle的HASH JOIN方法中,HASH TABLE将建立在其中一个表上,其他表将根据哈希表中的值进行连接。

你能告诉我什么是Hash表吗?哈希表的结构是什么?它将如何创建?

1 个答案:

答案 0 :(得分:2)

哈希表是一个表,您可以使用密钥存储内容。它就像一个数组,但存储方式不同

a('CanBeVarchar') := 1; -- A hash table

在oracle中,它们被称为associative arrays or index by tables.,你可以这样做:

TYPE aHashTable IS TABLE OF [number|varchar2|user-defined-types] INDEX BY VARCHAR2(30);
myTable aHashTable;

那么,它是什么?它只是一堆键值对。数据存储为具有头节点的链表,该头节点通过使用称为HashCode的东西对数据进行分组以更快地查找内容。像这样:

a    ->     b     ->    c
Any         Bitter      Class
Array       Bold        Count

假设您正在存储随机单词,这意味着(字典);当您存储以a开头的单词时,它将存储在“a”组中。所以,假设你想要这个myTable('Albatroz') := 'It's a bird',哈希码将被计算并放入它所属的A头节点:就在'Any'之上。 a,有一个指向Any的链接,它有一个指向Array的链接,依此类推。

现在,关于它的一个很酷的事情就是你得到快速的数据撤销,说你想要Count的意思,你这样做definition := myTable('Count');它会忽略搜索Any,Array,Bitter,Bold 。将直接在C头节点中搜索,进行trhough Class,最后计数;那很快!

这是一个维基百科链接:http://en.wikipedia.org/wiki/Hash_table

请注意,我的示例是过度简化的阅读,链接中有一些更详细的信息。

阅读更多详细信息,例如加载因子:如果我在a组中得到很多元素而在b和c中有很少的元素,会发生什么?现在寻找一个以a开头的单词并不是非常不合适,是吗?哈希表使用加载因子来重新组织和分配每个节点的负载,例如,表可以转换为子组:

从此

a          b     ->    c
Any        Bitter      Class
Anode      Bold        Count
Anti       
Array
Arrays
Arrow

到此

an    ->   ar      b     ->    c
Any        Array   Bitter      Class
Anode      Arrays  Bold        Count
Anti       Arrow

现在寻找像Arrow这样的单词会更快。