利用散列法來(lái)處理大的靜態(tài)統(tǒng)一表格
2024-07-21 02:38:49
供稿:網(wǎng)友
數(shù)據(jù)庫(kù)中的散列法是使用計(jì)算值來(lái)分配表格數(shù)據(jù)的方法,它比在整個(gè)索引中搜索要好的多。一個(gè)哈希散列答應(yīng)你在數(shù)據(jù)庫(kù)表格中存儲(chǔ)數(shù)據(jù),以便這些行的要害計(jì)算的相同值存儲(chǔ)在相同的位置。
為了在哈希散列中找到一個(gè)行,查詢機(jī)應(yīng)用哈希函數(shù)到一個(gè)行的要害值,然后分配和那個(gè)值相關(guān)的數(shù)據(jù)塊。在很多情況下,一個(gè)哈希散列比一個(gè)普通的索引快。
Oracle在Oracle 7面世的時(shí)候就支持哈希散列。哈希散列的優(yōu)勢(shì)僅僅在于當(dāng)表格的訪問(wèn)在要害值上首先使用的是=操作符,這個(gè)表格是靜態(tài)的,并且僅僅當(dāng)數(shù)據(jù)行需要的時(shí)候。當(dāng)和一個(gè)普通非索引或者散列表格比較的時(shí)候,全表掃描就會(huì)變慢。
比如,假設(shè)你想要?jiǎng)?chuàng)建一個(gè)表格來(lái)查找英語(yǔ)單詞的發(fā)音。你需要迅速的分配一個(gè)英語(yǔ)單詞的發(fā)音,但是一個(gè)字典,比如cmudict0.3有大概106,000個(gè)單詞。
創(chuàng)建哈希散列最大的工作任務(wù)就是分析參數(shù)。你需要計(jì)算分析每個(gè)散列的帶和散列要害字包含的內(nèi)容數(shù)量。假如三類是正整數(shù),那么你可以設(shè)置最小值的大小假如你需要定義自己哈希函數(shù)。
對(duì)于任何其他類型的數(shù)據(jù),比如下面這個(gè)列子,你需要計(jì)算參數(shù)的最小大小。你可以通過(guò)使用DBMS_UTILITY.GET_HASH_VALUE函數(shù)來(lái)獲得一個(gè)確切的估計(jì)。
create table cmudict
(
Word varchar2(22) PRimary key,
pron varchar2(62)
);
使用其他的快速裝入程序比如SQL*來(lái)裝入這些數(shù)據(jù):
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表達(dá)式使用每個(gè)欄來(lái)分析字節(jié)的數(shù)字。3+是行的開(kāi)銷,所以表達(dá)式的總和是存儲(chǔ)每個(gè)行所需要的大小。在每個(gè)哈希函數(shù)組中,求和行的大小,我們獲得每個(gè)散列數(shù)據(jù)塊所許喲啊的字節(jié)數(shù)量。1是真的不切實(shí)際,但是10007,一個(gè)質(zhì)數(shù),是對(duì)哈希要害字參數(shù)的最好猜測(cè)。
增加或者減少這個(gè)值到另外一個(gè)質(zhì)數(shù)知道上面的分析結(jié)果降低數(shù)據(jù)塊大小的重要性。這些數(shù)字,分析的結(jié)果和GET_HASH_VALUE的第三個(gè)參數(shù)應(yīng)該被使用來(lái)創(chuàng)造散列。
現(xiàn)在你可以創(chuàng)造一個(gè)散列并使用這個(gè)散列存儲(chǔ)數(shù)據(jù)再創(chuàng)建一個(gè)表格。
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);
假如你需要分析這個(gè)散列:
analyze cluster cmudict_cluster compute statistics;
select * from user_clusters where cluster_name = 'CMUDICT_CLUSTER';
你可以看到AVG_BLOCKS_PER_KEY 是 1.
可以為查詢語(yǔ)句做注解select * from cmudict where word = 'HELLO' returns:
SELECT STATEMENT
TABLE access HASH
CMUDICT