1. 程式人生 > >database system conception

database system conception

B+樹(書274)

靜態雜湊 在靜態雜湊中,我們將術語桶來表示能夠儲存一條或者多條記錄的一個儲存單位。

一般來說,用K來表示搜尋碼值的集合,用B來表示桶地址的集合,雜湊函式h就是從K到B的函式。

1.當插入一條搜尋碼為K的記錄的時候,先計算h(K),然後給出了存放該記錄的桶的地址,當有容納空間的時候,就把這條記錄儲存到桶中。
2.當查詢的時候,查詢搜尋碼值為K,只需要計算h(K),然後搜尋具有該地址的桶。如果出現了具有相同雜湊值的搜尋碼,就需要檢查記錄。

雜湊的用處一般是:

1.雜湊檔案組織:通過計算所需搜尋碼值上的一個函式直接獲得包含該記錄的磁碟塊地址。
2.雜湊索引組織:把搜尋碼以及它們相關聯的指標組織成一個雜湊檔案結構。

1.雜湊函式 一個理想的雜湊函式應當具有以下的條件:

1. 分佈均勻。也就是雜湊函式從所有可能的搜尋碼值集合中為每一個桶分配同樣數量的搜尋碼值
2. 分佈隨機。沒個桶分佈到的搜尋碼值的數目應幾乎相同,即不與外部因素有關,比如按照字母順序。

所以一個雜湊函式的設計要認真仔細,書289有關於某一個雜湊函式設計的例子。

2.桶溢位處理 如果同沒有足夠的空間,當插入時就會發生桶溢位。 一般發生有兩個原因:

·桶不足。x>y/z,其中x表示桶數目,y表示記錄總數,z表示一個桶能放入的記錄總數。
·偏斜。某些桶分配到的記錄比其它桶的記錄要多,所以即使其它桶有空間,也有可能發生溢位
	1.多條記錄具有相同的搜尋碼
	2.所選的雜湊函式可能造成搜尋碼的分佈不均

所以為了不造成桶溢位,桶的數目一般選為(x+y)*(1+d),d為避讓因子,雖然有可能造成一些空間浪費,但是減少了溢位的可能性。

1.閉地址 當發生桶溢位的時候,可以用溢位桶來解決溢位的問題。如果一條記錄插入到桶b中,桶b已滿,系統就會為桶b提供一個溢位桶。然後一個給定桶的所有溢位桶會用一個連結列表連結在一起,稱為溢位鏈。當查詢的時候,如果有溢位桶,也要查詢所有溢位桶中的記錄。

2.開地址 桶的集合是固定的,與閉地址不同,當它的一個桶滿了之後,系統會把記錄插入到初始桶集合B的其它桶中,或者直接使用下一個有空間的桶,這個策略叫做線性探查法。

雜湊方式的一個很大的缺點就是,在實現系統的時候必須選擇確定的雜湊函式,之後如果被索引的檔案變大或者縮小,要改變就不容易了。

3.雜湊索引 雜湊不僅可以用於檔案組織,還可以用於索引的建立。雜湊索引將相應的指標和搜尋碼組織成雜湊檔案結構。將雜湊函式作用於搜尋碼以確定對應的桶。然後將搜尋碼和相應指標存入該桶。 一般來說,雜湊索引只是一種輔助索引結構。

動態雜湊

如果準備使用靜態雜湊,會有三種選擇:

1.根據當前檔案大小選擇函式。但是當資料庫變大,效能會下降
2.根據未來某個時刻檔案大小的預計選擇雜湊函式。儘管會避免效能下降,但是初始會造成相當大的空間浪費。
3.隨著檔案增大,週期性的對檔案進行重組。

而動態雜湊允許雜湊函式動態改變,代表的就是可擴充雜湊。

1.資料結構 當資料庫增大或者縮小的時候,可擴充雜湊可以通過桶的分裂來適應變化。並且每次重組僅限於一個桶,帶來的開銷也會比較低。 當使用可擴充雜湊時,會選擇一個具有均勻性和隨機性的雜湊函式h。一般是b位二進位制數,典型的b值為32。但是不會為每一個雜湊值建立一個桶,那樣會有40億個桶,相反,我們是在把記錄插入檔案時按需建桶的。開始的時候我們不會使用全部的b位,任意時刻使用的位數 i 都滿足大於等於0,小於等於b。

在這裡插入圖片描述 如上圖所示,桶地址表上方的i表明雜湊值h(K)中有 i 位需要用來正確地定位對應於K的桶

2.查詢和更新(書293) 查詢:為了確定含有搜尋碼值K的桶的位置,系統取得h(K)的前 i 個高位,然後為這個位串查詢對應的表項,然後根據表項中的指標得到桶的位置。

插入:先通過上述的查詢,定位到桶,假設為桶j,如果該桶有剩餘空間,那麼久直接放進去就可以了。如果滿了,就要對桶進行分裂。

· 如果I = Ij,那麼久將 i 的值加一,從而使得桶地址表的大小翻倍。這樣元彪中的每個表項都被兩個表項替代,那麼指標也會翻
倍,即,兩個表項都包含和原始表項一樣的指標,現在桶地址表中就有兩個表項指向桶j。這個時候系統分配一個新的桶z,讓第
二個表項指向該新桶,然後將Ij和Iz置為i。接下來桶j中的各條記錄重新雜湊,根據前i位來確定記錄是放在桶j還是新桶中。
· 如果I>Ij,這樣系統不用增加i就可以分裂桶j,系統分配一個新桶z,然後把Ij和Iz置為原來的Ij加一後得到的值。然後就和上面的
情況一樣了。
· 當插入的值具有相同的雜湊值並且桶空間滿了的時候,就要使用溢位桶來處理。

刪除:先定位到桶的位置,然後不僅要把搜尋碼從桶中刪除,還要把記錄從檔案中刪除。如果這時桶變成空的,那麼痛也要刪除,這個時候桶的地址有可能合併,桶地址表的大小也要減半。

3.靜態雜湊和動態雜湊的比較 · 可擴充雜湊優點是可以隨著檔案的增長而不降低效能,並且空間開銷小。 · 儘管桶地址錶帶來額外的開銷,但是它只存放一個指標。 · 桶的分配是動態的。

但是缺點就是在查詢的時候設計到了一個附加的間接層,因為在系統訪問桶本身之前必須要先訪問一個桶地址表

4.順序索引和雜湊的比較 B+陣列織將記錄檔案組織成順序檔案,也可以使用雜湊來組織檔案,或者記錄成堆檔案(沒有任何順序) 各種方法各有優點,大多數資料庫支援B+樹索引