2

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

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

4

1 回答 1

2

哈希表是一个表,您可以在其中通过使用键来存储内容。它就像一个数组,但存储的东西不同

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

在 oracle 中,它们被称为关联数组或表索引。你做一个这样的:

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头节点中搜索,经过Class,最后是Count;那是快!

这里有一个维基百科链接: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会更快。

于 2012-11-03T19:46:23.923 回答