Oracle cluster [learning]

http://www.kuqin.com/database/20100905/87729.html


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的參數。

任何技術都要找到合適的應用場景,有利一定有弊,有些技術確實是看上去很美,但是並不實用,而有些方案看上去很土,但是可以解決問題,找到最合適的就好。

發佈了14 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章