表空間碎片化一二

最近遇到一個問題,有人說表空間的自動擴展會帶來碎片化,我以爲這是一個誤區,有必要說說。數據庫

 

1.何時開始出現碎片化?
表空間是一個邏輯的概念,爲數據庫提供使用空間的邏輯結構,其對應物理結構是數據文件,一個表空間能夠包含多個數據文件。
表空間存放的是段(segment)。而段是數據庫一種邏輯結構,包括表段,索引段,回滾段等,段存在於表空間中,並對應必定的存儲空間。性能

那何時開始出現碎片化呢?
全部的Oracle段(爲了理解方便,後面把segment做爲表的一個同義詞)都有一個在段內容納數據的上限,咱們把這個上限稱爲"high water mark"或HWM。
這個HWM是一個標記,用來講明已經有多少沒有使用的數據塊分配給這個segment。原則上HWM只會增大,不會縮小,即便將表中的數據所有刪除(delete),HWM仍是爲原值,因爲這個特色,使HWM很象一個水庫的歷史最高水位,這也就是HWM的原始含義,固然不能說一個水庫沒水了,就說該水庫的歷史最高水位爲0。
回過頭來,當表空間中生成一個段時,將從表空間有效自由空間中爲這個段的初始範圍分配空間。在這些初始範圍充滿數據時,段會請求增長另外一個範圍。這樣的擴展過程會一直繼續下去,直到達到最大的範圍值,或者在表空間中已經沒有自由空間用於下一個範圍。最理想的狀態就是一個段的數據可被存在連續的一個範圍中。這樣,全部的數據存儲時靠近段內其它數據,而且尋找數據可少用一些指針。可是一個段包含多個範圍的狀況是大量存在的,沒有任何措施能夠保證這些範圍是相鄰存儲的。當要知足一個空間要求時,數據庫再也不合並相鄰的自由範圍(除非別無選擇),而是尋找表空間中最大的自由範圍來使用。這樣將逐漸造成愈來愈多的離散的、分隔的、較小的自由空間,即碎片。spa

以上就是產生碎片化的緣由。最理想的情況就是一個表初始化後全部段都是連續的,這樣就不會有碎片,可是實際生產中不可能全部的表都是不變的。只要表的數據一發生變化就會存在擴展,一涉及到擴展,數據庫就有可能申請到分隔開的較小的自由空間,因此說碎片化的產生和和表空間自動擴展仍是手工擴展沒有啥關係。若是非要保證表空間不會出現碎片化,那麼就只有一種可能----數據庫不會再發生變化。指針

2.怎麼調整表空間的大小?
表空間是一種邏輯的概念,所謂調整表空間大小其實就是調整這個表空間所對應的物理上的數據文件的大小。
一個表空間能夠包含多個數據文件,這些數據文件能夠一部分是自動擴展的,能夠一部分是不能自動擴展的。
調整表空間的手段有:
(1)添加數據文件
(2)給數據文件設置自動擴展:在塊大小爲8K的表空間,最大值爲:32768M,換句話說,若是這個表空間的某一個數據文件的初始值是10G,那麼將該數據文件設置爲自動擴展後,該數據文件的最大值能達到32G,而當這個數據文件達到了32G後,若是須要擴展表空間的大小,那麼仍然須要添加新的數據文件。
(3)對數據文件進行resize。這個用在2個地方:第1個是以爲初始化的數據文件過大須要收縮能夠用;第2個是初始化的數據文件太小,且關閉了自動擴展,那麼也能夠用resize來使得數據文件變大。索引

3.是否須要設置表空間自動擴展呢?
我的以爲頗有必要,爲何呢?當表空間被寫滿的時候,若是沒有自動擴展的功能,那麼相應的表空間就會報錯夯住,數據寫不進去,這個時候就會影響業務了。而Oracle自身就提供了數據文件自動擴展的功能,咱們爲何不用它呢?非要本身監控而後本身再去手工resize來擴展表空間以獲取更多的犯錯概率?監控

4.自動擴展是否會影響性能?
固然會影響性能!假設初始化一個表空間只有一個數據文件且這個數據文件設置了自動擴展,這個數據文件只有10G。當表空間滿了達到10G的時候,數據文件會一邊擴展一邊寫入數據,確定對數據庫的性能有影響。擴展

表空間能自動擴展的觸發條件是什麼?
(1)表空間滿了
(2)對應的數據文件還有擴展的空間(8K的塊大小對應的數據文件最大爲32G)
若是表空間滿了,並且它對應的數據文件已經擴展到最大的32G了,那麼當自動擴展開始的時候,這個表空間仍然會報錯,告知沒法擴展。請求

怎麼避免或者減小自動擴展帶來的性能問題呢?
最不差錢的方法就是咱存儲空間特別多先給表空間分配足夠多足夠大的數據文件;若是沒有那麼多存儲的話,那就在初始化表空間的時候分配必定數量的數據文件,將一部分直接設置爲最大的32G,另一部分初始化爲10G並讓其自動擴展。剩下的就是監控表空間使用率,當表空間達到必定閾值的時候,對其添加新的數據文件。方法

相關文章
相關標籤/搜索