oracle段管理歸納

dawn009發表於2014-04-18

(1)段、區段、塊
Oracle中的段segment是佔用磁碟儲存空間的一個物件。從邏輯上講一個資料庫由若干表空間(TABLESAPCE)組成,每個表空間有若干個表(TABLE),每個表又可以分為若干資料段(DATA SEGMENT),索引段等,每個段又可分為若干資料庫區間(EXTENT),每個區間由若干資料塊(BLOCK)組成。區段(EXTENT)是最小的分配單。塊(BLOCK) 是最小的儲存單位。

 

(2)常見的段型別
1聚簇cluster:分為雜湊聚簇和B*樹聚簇,通常用於儲存多個表上的相關資料。

              可以在聚簇段中建表,此時這個表可能與其它表同在一個聚簇段中。
2表table:表段用於儲存一個資料庫表的資料,是最常用的段型別,通常與索引段結合使用。
3表分割槽partition或子分割槽subpartition:主要用於分割槽,與表段型別。
4索引index:這種段型別用於儲存索引結構。
5Lob分割槽、子分割槽、索引、Lob段:用於儲存大物件的結構。每個LOB列需要分別建立兩個段,
一個用於儲存CLOB或BLOB的

                               實際資料塊logsegment,另一個是用於跟蹤這些LOB塊在哪裡的lobindex。
6巢狀表nested table,這是為巢狀表指定的段型別。
7回滾段,用於存放undo的資料。

 

(3)段的管理
3.1手動段空間管理Manual Segment Space Management

手動設定FreeLists、FreeList Groups、PctUsed、其它引數來控制如何分配、使用、重用段空間。MSSM是oracle的遺留實現,許多版本都支援MSSM。

 

3.2自動段空間管理Automatic Segmnet Space Management

只需要控制與空間使用相關的PctFree,其它引數被忽略。ASSM只有在9i版本後才被引入,用於減少MSSM中的太多引數的管理。


應用於ASSM段的儲存設定只有Buffer_Pool、PctFree、IniTrans、MaxTrans(10g後的版本都會忽略這個引數),其它儲存和物理屬性引數都不適用於ASSM段。


段空間管理是從段的表空間繼承來的一個屬性,而且段都沒有跨表空間,段要使用ASSM就必須位於支援ASSM空間管理的表空間中。


3.3HWM高水平線
HWM是隨著表資料的增長而增長的;只有重建、截除、收縮物件時,HWM才會降低。HWM很重要,因為在oracle進行全表掃描時會掃描HWM下的所有塊,即使這張資料庫表不包含任何資料。


TrunCate會把表的HWM重新置為0,還會截除表上的相關索引,而DELETE整張表時並沒有修改HWM,所以如果打算刪除表的所有行,應儘量使用TrunCate。

 

在MSSM表空間中,段只有一個HWM。但在ASSM表空間中,除了HWM外,還有一個低HWM。這是因為在ASSM中,HWM推進時,ORACLE並沒有立即格式化所有的物理塊,而是隻在第一次使用時才會完成格式化,以便安全讀取。

 

3.4freelists

freelists是使用MSSM表空間時,oracle使用塊時,需要把塊放在freelist或從freelist中刪除,freelists可能對效能有很大的提升或有很大的影響。

而在ASSM中,沒有也不用去設定freelist引數:
create tablespace assm datafile size 10m autoextend on next 1m segment space management auto;
create table xxx(......) tablespace assm;

 


(4)pctfree與pctused
PctFree告訴oracle應該在塊上保留多少空間來完成將來的更新,預設值是10%。如果自由空間的百分比高於PctFree指定值,這個塊就稱為自由的。PctUsed告訴oracle應在當前不自由的塊上自由空間的百分比需要達到多大時,才能使它再次變為自由的,預設值為40%。


使用MSSM 時,這兩個引數設定控制著塊何時放入freelist 中,以及何時從freelist 中取出。如果使用預設值:PCTFREE為10,PCTUSED為40,那麼在塊到達90%滿之前(有10%以上的自由空間),這個塊會一直在freelist 上。一旦到底90%,就會從freelist 中取出,而且直到塊上的自由空間超過了塊的60%時,才會重新回到freelist上,在此之前,這個塊一直不在freelist上。

 

使用ASSM 時,PCTFREE 仍然會限制能否將一個新行插入到一個塊中,但是它不會控制一個塊是否在freelist上,因為ASSM根本不使用freelist。在ASSM 中,PCTUSED引數將被忽略。


如果把塊的PCTFREE 設定得過高,就會浪費空間。如果把PCTFREE 設定為50%,而你從未更新資料,那麼每個塊都會浪費50%的空間。不過,對行初始很小,現在想將行的大小加倍,這種情況下50%的設定就非常合理。但是倘若PCTFREE 設定得太小,更新行時就會導致行遷移。

 

高PCTFREE,低PCTUSED

如果你插入了將要更新的大量資料,而且這些更新會頻繁地增加行的大小,此時就適合採用這種設定。這種設定在插入後會在塊上預留大量的空間(高PCTFREE),並使得將塊放回到freelist 之前必須幾乎為空(低PCTUSED)。

 

低PCTFREE,高PCTUSED

如果你只想對錶完成INSERT 或DELETE,或者如果你確實要完成UPDATE,但UPDATE 只是縮小行的大小,此時這種設定就很適合。

 

 

(5)行遷移row migration 

行遷移是指由於某一行變得太大,無法再與其餘的行一同放在建立這一行的塊中(塊中已經放不下這一行),這就要求這一行離開原來的塊。行遷移只會影響效能。

oracle的段管理

oracle的段管理

oracle的段管理

圖10-3:原來的塊上有1/7的自由空間,第4行也佔用塊上1/7的空間,現在假定想把第4行update為原來的兩倍大小;
圖10-4:此時,即使oracle合併了自由空間,自由空間還是小於第4行的當前大小,

        所有oracle並沒有合併自由空間,塊仍保持原樣;
圖10-5:由於容納不了新第4行的大小,所以oracle會移動或遷移這一行。

        當然也不是簡單移動,oralce必須留下一個轉發地址(指標);
---------------------------------------&gt>
轉載於:http://blog.sina.com.cn/s/blog_555948f801008xxz.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1144616/,如需轉載,請註明出處,否則將追究法律責任。

相關文章