1. 程式人生 > >pctused and pctfree 表示什麼含義有什麼作用

pctused and pctfree 表示什麼含義有什麼作用

 這牽涉到segment的管理了,由於oracle提供兩種段管理方式一種是手動一種是ASSM方式管理、

當建立表或索引的時候其對應的段會以extents為單位來分配空間的,如果之後再次插入資料還是會以extents來分配空間的,因為這樣可以快速得到很多資料塊(知道一個起始塊和一個結尾塊)就可以知道有哪些資料塊可以使用了,當然正是這樣也容易引起碎片問題,所以需要定期進行碎片清理工作。

第一種手動管理實際上是當需要插入資料的時候先會檢索已經申請完的extents內的資料塊是否有可用空間,如果沒用會再次以extents為單位申請空間,這種檢索申請完的extents的資料塊的過程實際是先檢索段頭塊上的一個freelist,這個freelist實際是一個可用塊的列表,具體什麼叫可以塊那麼就是以pctused,pctfree來標示的,這裡表上的資料塊的可用空間應該都是大於pctfree,因為當資料插入完資料塊後 資料塊的可用空間百分比如果小於pctfree設定值 那麼會把這個資料塊從這個freelist上解除安裝下來,當用過一段時間以後可能這個資料塊裡面的資料被刪除可用空間的百分比大於pctfree的值了 那麼暫時還不會掛到freelist上 因為還需要資料塊的使用空間要小於pctused值那麼這個資料塊才可以掛到這個freelist上面來。由於每次分配空間的時候都會檢索freelist,並且如果想遍歷freelist還需要得到latch這樣就會產生爭用問題,造成buffer busy wait等待事件

第二種assm自動管理模式 實際上是用點陣圖描述資料塊的可用情況來實現的,這種Bitmapped block會分佈到資料塊之中,會有多個位圖塊。這個點陣圖會通過記錄某一範圍資料塊使用情況來實現管理,通過分級來實現快速找到可用塊 比如level1 0001 25%以下 level2 0010 50%~75% 0011 75%以上,由於會有多個這種點陣圖塊 oracle可以在遍歷extents map的時候快速定位到點陣圖塊來檢視是否有可用資料塊,正是這種設計減輕了序列爭用問題,大大減少了對cpu的佔用率,以及引起的效能問題,這種方式仍然用到了pctfree,設定這個值為了給更新提供空間,因為如果pctfree = 0 雖然資料塊可以提高利用率但是可能會引起block migration問題 這種問題就是如果更新後的資料不能放在同一個資料塊中那麼會把該資料放到另一個數據塊 並在本資料塊裡面記錄那些存不下而放到其他資料塊的地址。這會造成很嚴重的效能問題