在 oracle 的 HASH JOIN 方法中,HASH TABLE 将建立在其中一张表上,其他表将根据哈希表中的值进行连接。
你能告诉我什么是哈希表吗?哈希表的结构是什么?它将如何创建?
在 oracle 的 HASH JOIN 方法中,HASH TABLE 将建立在其中一张表上,其他表将根据哈希表中的值进行连接。
你能告诉我什么是哈希表吗?哈希表的结构是什么?它将如何创建?
哈希表是一个表,您可以在其中通过使用键来存储内容。它就像一个数组,但存储的东西不同
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
会更快。