聚簇

聚簇

聚簇是為了提高某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱為聚簇碼)上具有相同值的元組集中存放在連續的物理塊。

目錄

正文


聚簇功能
聚簇功能可以大大提高按聚簇碼進行查詢的效率。例如要查詢信息系的所有學生名單,設信息系有500名學生,在極端情況下,這500名學生所對應的數據元組分佈在500個不同的物理塊上。儘管對學生關係已按所在系建有索引,由索引很快找到了信息系學生的元組標識,避免了全表掃描,然而再由元組標識去訪問數據塊時就要存取500個物理塊,執行500次I/O操作。如果將同一系的學生元組集中存放,則每讀一個物理塊可得到多個滿足查詢條件的元組,從而顯著地減少了訪問磁碟的次數。
聚簇功能不但適用於單個關係,也適用於經常進行連接操作的多個關係。即把多個連接關係的元組按連接屬性值聚集存放,聚簇中的連接屬性稱為聚簇碼。
這就相當於把多個關係按"預連接"的形式存放,從而大大提高連接操作的效率。
一個資料庫可以建立多個聚簇,一個關係只能加入一個聚簇。
選擇聚簇存取方法,即確定需要建立多少個聚簇,每個聚簇中包括哪些關係。
下面先設計候選聚簇,一般來說:
(1)對經常在一起進行連接操作的關係可以建立聚簇;
(2)如果一個關係的一組屬性經常出現在相等比較條件中,則該單個關係可建立聚簇;
(3)如果一個關係的一個(或一組)屬性上的值重複率很高,則此單個關係可建立聚簇。即對應每個聚簇碼值的平均元組數不是太少。太少了,聚簇的效果不明顯。
然後檢查候選聚簇中的關係,取消其中不必要的關係:
(1)從聚簇中刪除經常進行全表掃描的關係;
(2)從聚簇中刪除更新操作遠多於連接操作的關係;
(3)不同的聚簇中可能包含相同的關係,一個關係可以在某一個聚簇中但不能同時加入多個聚簇。要從這多個聚簇方案(包括不建立聚簇)中選擇一個較優的,即在這個聚簇上運行各種事務的總代價最小。
必須強調的是,聚簇只能提高某些應用的性能,而且建立與維護聚簇的開銷是相當大的。對已有關係建立聚簇,將導致關係中元組移動其物理存儲位置並使此關係上原有的索引無效,必須重建。當一個元組的聚簇碼值改變時,該元組的存儲位置也要做相應移動,聚簇碼值要相對穩定,以減少修改聚簇碼值所引起的維護開銷。
因此,當通過聚簇碼進行訪問或連接是該關係的主要應用,與聚簇碼無關的其他訪問很少或者是次要的,這時可以使用聚簇。尤其當SQL語句中包含有與聚簇碼有關的ORDER BYGROUP BYUNION,DISTINCT等子句或短語時,使用聚簇特別有利,可以省去對結果集的排序操作;否則很可能會適得其反。