數據庫中的散列法是使用計算值來分配表格數據的方法,它比在整個索引中搜索要好的多。一個哈希散列允許你在數據庫表格中存儲數據,以便這些行的關鍵計算的相同值存儲在相同的位置。
爲了在哈希散列中找到一個行,查詢機應用哈希函數到一個行的關鍵值,然後分配和那個值相關的數據塊。在很多情況下,一個哈希散列比一個普通的索引快。
Oracle在Oracle 7面世的時候就支持哈希散列。哈希散列的優勢僅僅在于當表格的訪問在關鍵值上首先使用的是=操作符,這個表格是靜態的,並且僅僅當數據行需要的時候。當和一個普通非索引或者散列表格比較的時候,全表掃描就會變慢。
比如,假設你想要創建一個表格來查找英語單詞的發音。你需要迅速的分配一個英語單詞的發音,但是一個字典,比如cmudict0.3有大概106,000個單詞。
創建哈希散列最大的工作任務就是分析參數。你需要計算分析每個散列的帶和散列關鍵字包含的內容數量。如果三類是正整數,那麽你可以設置最小值的大小如果你需要定義自己哈希函數。
對于任何其他類型的數據,比如下面這個列子,你需要計算參數的最小大小。你可以通過使用DBMS_UTILITY.GET_HASH_VALUE函數來獲得一個確切的估計。
create table cmudict
(
word varchar2(22) primary key,
pron varchar2(62)
);
使用其他的快速裝入程序比如SQL*來裝入這些數據:
select max(blksize)
from (select sum(3+nvl(vsize(word),0)+1+nvl(vsize(pron),0)+1) blksize
from cmudict group by dbms_utility.get_hash_value(word,1,10007)) blkqry;
NVL(VSIZE(col),0)+1表達式使用每個欄來分析字節的數字。3+是行的開銷,所以表達式的總和是存儲每個行所需要的大小。在每個哈希函數組中,求和行的大小,我們獲得每個散列數據塊所許喲啊的字節數量。1是真的不切實際,但是10007,一個質數,是對哈希關鍵字參數的最好猜測。
增加或者減少這個值到另外一個質數知道上面的分析結果降低數據塊大小的重要性。這些數字,分析的結果和GET_HASH_VALUE的第三個參數應該被使用來創造散列。
現在你可以創造一個散列並使用這個散列存儲數據再創建一個表格。
create cluster cmudict_cluster (word varchar2(22))
size 6000
single table
hashkeys 739;
create table cmudict
(
word varchar2(22) not null,
pron varchar2(62)
)
cluster cmudict_cluster(word);
如果你需要分析這個散列:
analyze cluster cmudict_cluster compute statistics;
select * from user_clusters where cluster_name = 'CMUDICT_CLUSTER';
你可以看到AVG_BLOCKS_PER_KEY 是 1.
可以爲查詢語句做注解select * from cmudict where word = 'HELLO' returns:
SELECT STATEMENT
TABLE ACCESS HASH
CMUDICT