Oracle中普通的表稱為堆表(heap table),堆表中的資料是無序存放的,往往在使用一段時間後,資料就變得非常無序。如所示,索引中相同的key對應的資料存放在不同的block中,這時,如果要通過索引查詢某個key的資料,就需要訪問很多不同的block,代價非常高。
Oracle中有一個統計資訊clustering factor,它就是用來反映索引中索引值在表中的有序程度,clustering factor的值如果接近表的blocks的數量,表明資料在表中的是有序的,而如果這個值接近表的行數,則表明表中的資料是無序存放的。因為clustring factor對於索引查詢的影響很大,所以在CBO計算cost時,這個值非常重要。
我們可以通過建立一個單表的hash cluster,將相同索引值的資料物理存放在一起,達到提高效能的目的。建立cluster有兩個最重要的參數:hashkeys和size,前者表示cluster中有多少個不同的索引值,後者表示每個索引值需要分配的空間。因為hash cluster的空間是預先分配的,這兩個值的正確設定對cluster的效能影響非常大。hashkeys設定過大,會造成空間浪費,而如果設定過小,則會產生大量的hash碰撞,極大影響效能。size也是一樣,設定過大會浪費空間,而設定過小,資料超過預先分配的空間時,會通過連結方式存放在溢出段中,影響效能。而這兩個值一旦設定,就無法更改,除非重建cluster。
hash cluster簡單的說就是通過預先分配空間的方式,將相同key的資料存放在一起,以提高查詢效能的一種手段,所以準確的設定hashkeys和size參數是使用hash cluster的關鍵,使用的前提是key的數量是可以估算的,而且每個key的資料是基本平均的。但是,在實際使用的環境中,資料量的變化往往是不可預知的,這也造成hash cluster的應用情境非常有限。
Index cluster和hash cluster類似,只不過index cluster是通過索引實現資料定位,而且index cluster的空間是動態分配的,但是同樣存在正確設定size參數的問題,設定過大過小都會產生效能問題。
個人觀點:Oracle cluster更適合相對待用資料的儲存,對於OLTP應用來說,cluster在大部分情況下都不太適用,因為我們都無法預估到資料量的變化,根本無法合理設定cluster的參數。
任何技術都要找到合適的應用情境,有利一定有弊,有些技術確實是看上去很美,但是並不實用,而有些方案看上去很土,但是可以解決問題,找到最合適的就好。