資料庫表--hash clustered table

jelephant發表於2013-12-09
Hash clustered table與索引聚簇表非常相似,只有一個主要區別:聚簇鍵索引被一個hash函式所取代,表中的資料就是索引.所以沒有物理索引
hash clustered table也有副作用,如果不對錶加一個傳統索引,將無法對錶進行range scan,比如 select * from emp where deptno between 10 and 20,會產生全表掃描.
理想情況下,雜湊值均勻地分佈到為雜湊聚簇分配的所有塊上,從查詢利用一個I/O就能直接找到資料。實際中,最後可能會有多行資料的雜湊值雜湊到同一個資料庫塊地址,而且這個塊上放不下這麼多行,這就會導致塊串鏈,用一個連結串列把塊串起來,來儲存雜湊到這個塊的所有行,當需要獲取與某個雜湊鍵匹配的行時,可能必須訪問多個塊。此外,雜湊衝突也會增加開銷,使塊串聯的可能性增加。

相關引數:
HASHKEYS:Oracle將HASHKEYS值“舍入”為與之最接近的質數(雜湊鍵數總是一個質數),然後再將SIZE引數乘以修改後的HASHKEYS值,根據這個結果為聚簇分配空間。也就是至少需要分配的空間位元組數。可以用公式(HASHKEYS/trunc(blocksize/SIZE))來計算雜湊聚簇需要預留的最少塊數量。對一個幾乎為空的雜湊聚簇進行全表掃描與全面掃描一個滿的雜湊聚簇所花的時間是一樣的。所以,建立雜湊聚簇的目的是為了根據雜湊鍵查詢從而非常快地訪問資料,而不是為了頻繁地對它進行全面掃描。

HASH IS:此選項用來指定雜湊函式。可以指定一個SQL函式。如果不指定則使用Oracle內部的雜湊函式。

SINGLE TABLE:此選項用來指定建立單表雜湊聚簇(single table hash cluster),這是雜湊聚簇有一個特例。它只支援聚簇中存在一個表。這種雜湊聚簇是為按主鍵來快速訪問一個表而設計得。單表雜湊聚簇需要更少的緩衝區latch來完成處理,並CPU的用量會大幅減少

建立雜湊聚簇表步驟如下:
建立雜湊聚簇
create cluster emp_dep_cluster (depno number(2)) hashkeys 100 size 2048 hash is depno;

建立表
create table department (  
  depno number(2) primary key, depname varchar2(20))  
  cluster emp_dep_cluster(depno);
create table employee (  
  empno number primary key, empname varchar2(20),   
  depno number(2) references department(depno))  
  cluster emp_dep_cluster(depno);

hash clustered table的要點是:
1)hash clustered table中是把傳遞到查詢的需求轉換成一個FILE/BLOCK,並且直接讀,不經過索引.
2)hash clustered table的I/O要少得多,因為heap table要至少做一次I/O來獲取rowid,然後透過rowid來訪問表
3)雜湊聚簇查詢與索引查詢所用的CPU是一樣的,儘管它訪問buffer hash的次數要少得多。但執行hash是一個CPU相當密集的操作(索引是I/O密集的操作).這裡要做個權衡.

hash clustered table小結

1) 雜湊聚簇一開始就要分配空間。Oracle根據你的HASHKEYS和SIZE來計算HASHKEYS/trunc
(blocksize/SIZE),立即分配空間,並完成格式化,一旦將第一個表放入這個聚簇中,任何
   全面掃描都會命中每一個已分配的塊。在這方面,它與其他的所有表都不同。


2) 雜湊聚簇中的HASHKEY 數是固定大小的。除非重新聚簇,否則不能改變雜湊表的大小。這
    並不會限制聚簇中能儲存的資料量,它只是限制了能為這個聚簇生成的惟一雜湊鍵的個數。如
    果HASHKEY 值設定得太低,可能因為無意的雜湊衝突影響效能。


3) 不能在聚簇鍵上完成區間掃描。諸如WHERE cluster_key BETWEEN 50 AND 60 謂詞條件
    不能使用雜湊演算法。介於50~60 之間的可能值有無限多個,伺服器必須生成所有可能的值,並
    分別計算雜湊,來檢視相應位置是否有資料。這是不可能的。如果你在一個聚簇鍵上使用區間
    掃描,而且沒有使用傳統索引,實際上會全面掃描這個聚簇。

雜湊聚簇適用於以下情況:
· 很清楚表中會有多少行,或者知道一個合理的上界。HASHKEY和SIZE引數的大小要正確,這對於避免聚簇重建至關重要。
· 主要執行獲取操作相比,DML(特別是插入)很少。更新不會引入嚴重的開銷, 除非更新了HASHKEY(更新HASHKEY會導致行遷移)。
· 經常按HASHKEY值訪問資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29337971/viewspace-1062759/,如需轉載,請註明出處,否則將追究法律責任。

相關文章