()段區段塊
Oracle中的段segment是占用磁盤存儲空間的一個對象從邏輯上講一個數據庫由若干表空間(TABLESAPCE)組成每個表空間有若干個表(TABLE)每個表又可以分為若干數據段(DATA SEGMENT)索引段等每個段又可分為若干數據庫區間(EXTENT)每個區間由若干數據塊(BLOCK)組成區段(EXTENT)是最小的分配單塊(BLOCK) 是最小的存儲單位
()常見的段類型
聚簇cluster分為散列聚簇和B*樹聚簇通常用於存儲多個表上的相關數據
可以在聚簇段中建表此時這個表可能與其它表同在一個聚簇段中
表table表段用於保存一個數據庫表的數據是最常用的段類型通常與索引段結合使用
表分區partition或子分區subpartition主要用於分區與表段類型
索引index這種段類型用於保存索引結構
Lob分區子分區索引Lob段用於保存大對象的結構每個LOB列需要分別創建兩個段一個用於存儲CLOB或BLOB的
實際數據塊logsegment另一個是用於跟蹤這些LOB塊在哪裡的lobindex
嵌套表nested table這是為嵌套表指定的段類型
回滾段用於存放undo的數據
()段的管理
手動段空間管理Manual Segment Space Management
手動設置FreeListsFreeList GroupsPctUsed其它參數來控制如何分配使用重用段空間MSSM是oracle的遺留實現許多版本都支持MSSM
自動段空間管理Automatic Segmnet Space Management
只需要控制與空間使用相關的PctFree其它參數被忽略ASSM只有在i版本後才被引入用於減少MSSM中的太多參數的管理
應用於ASSM段的存儲設置只有Buffer_PoolPctFreeIniTransMaxTrans(g後的版本都會忽略這個參數)其它存儲和物理屬性參數都不適用於ASSM段
段空間管理是從段的表空間繼承來的一個屬性而且段都沒有跨表空間段要使用ASSM就必須位於支持ASSM空間管理的表空間中
HWM高水平線
HWM是隨著表數據的增長而增長的只有重建截除收縮對象時HWM才會降低HWM很重要因為在oracle進行全表掃描時會掃描HWM下的所有塊即使這張數據庫表不包含任何數據
TrunCate會把表的HWM重新置為還會截除表上的相關索引而DELETE整張表時並沒有修改HWM所以如果打算刪除表的所有行應盡量使用TrunCate
在MSSM表空間中段只有一個HWM但在ASSM表空間中除了HWM外還有一個低HWM這是因為在ASSM中HWM推進時ORACLE並沒有立即格式化所有的物理塊而是只在第一次使用時才會完成格式化以便安全讀取
freelists
freelists是使用MSSM表空間時oracle使用塊時需要把塊放在freelist或從freelist中刪除freelists可能對性能有很大的提升或有很大的影響
而在ASSM中沒有也不用去設置freelist參數
create tablespace assm datafile size m autoextend on next m segment space management auto;
create table xxx() tablespace assm;
()pctfree與pctused
PctFree告訴oracle應該在塊上保留多少空間來完成將來的更新默認值是%如果自由空間的百分比高於PctFree指定值這個塊就稱為自由的PctUsed告訴oracle應在當前不自由的塊上自由空間的百分比需要達到多大時才能使它再次變為自由的默認值為%
使用MSSM 時這兩個參數設置控制著塊何時放入freelist 中以及何時從freelist 中取出如果使用默認值PCTFREE為PCTUSED為那麼在塊到達%滿之前(有%以上的自由空間)這個塊會一直在freelist 上一旦到底%就會從freelist 中取出而且直到塊上的自由空間超過了塊的%時才會重新回到freelist上在此之前這個塊一直不在freelist上
使用ASSM 時PCTFREE 仍然會限制能否將一個新行插入到一個塊中但是它不會控制一個塊是否在freelist上因為ASSM根本不使用freelist在ASSM 中PCTUSED參數將被忽略
如果把塊的PCTFREE 設置得過高就會浪費空間如果把PCTFREE 設置為%而你從未更新數據那麼每個塊都會浪費%的空間不過對行初始很小現在想將行的大小加倍這種情況下%的設置就非常合理但是倘若PCTFREE 設置得太小更新行時就會導致行遷移
高PCTFREE低PCTUSED
如果你插入了將要更新的大量數據而且這些更新會頻繁地增加行的大小此時就適合采用這種設置這種設置在插入後會在塊上預留大量的空間(高PCTFREE)並使得將塊放回到freelist 之前必須幾乎為空(低PCTUSED)
低PCTFREE高PCTUSED
如果你只想對表完成INSERT 或DELETE或者如果你確實要完成UPDATE但UPDATE 只是縮小行的大小此時這種設置就很適合
()行遷移row migration
行遷移是指由於某一行變得太大無法再與其余的行一同放在創建這一行的塊中(塊中已經放不下這一行)這就要求這一行離開原來的塊行遷移只會影響性能
From:http://tw.wingwit.com/Article/program/Oracle/201311/17472.html