Oracle PCTFREE PCTUSED FREELIST 講的明白
在早期的手動空間管理階段,Oracle通過一種列表結構FREE LIST來記錄資料塊的使用情況。需要為每個段設定幾個引數。
PCTFREE定義資料塊中空閒空間百分比
PCTUSED定義資料塊被使用的空間百分比
FREELISTS每個段使用的空閒列表數量
PCTFREE儲存引數告訴ORACLE什麼時候應該將資料塊從物件的空閒列表中移出。ORACLE的預設引數是PCTFREE=10;也就是說,一旦一個INSERT操作使得資料塊的90%被使用,這個資料塊就從空閒列表(free list)中移出。
PCTUSED儲存引數告訴ORACLE什麼時候將以前滿的資料塊加到空閒列表中。當記錄從資料表中刪除時,資料庫的資料塊就有空間接受新的記錄,但只有當填充的空間降到PCTUSED值以下時,該資料塊才被連線到空閒列表中,才可以往其中插入資料。PCTUSED的預設值是PCTUSED=40。
儲存引數規則小結
(1)PCTUSED較高意味著相對較滿的資料塊會被放置到空閒列表中,從而有效的重複使用資料塊的空間,但會導致I/O消耗。PCTUSED低意味著在一個數據塊快空的時候才被放置到空閒列表中,資料塊一次能接受很多的記錄,因此可以減少I/O消耗,提高效能。
(2)PCTFREE的值較大意味著資料塊沒有被利用多少就從空閒列表中斷開連線,不利於資料塊的充分使用。PCTFREE過小的結果是,在更新時可能會出現資料記錄遷移(Migration)的情況。(注:資料記錄遷移(Migration)是指記錄在是UPDATE操作擴充套件了一個VARCHAR2型別的列或BLOB列後,PCTFREE引數所指定的空間不夠擴充套件,從而記錄被ORACLE強制遷移到新的資料塊,發生這種情況將較嚴重的影響ORACLE的效能,出現更新緩慢)。
當進行大量更新操作,並且會增加行長度,這時可以設定大的pctfree;當進行大量插入和刪除操作,並且不會引起行長度的增加,設定高的pctused,可以快速刪除來重新利用釋放的空間。
通過設定合適的pctfree和pctused 來避免行連結和行遷移。
行連結是指如果一個數據塊無法裝下一行的資料,會把為行分配另一個數據塊。
行遷移是指如果在一個數據塊內進行大量的更新操作,從而引起行長度增加,而此時塊內的空閒空間又無法容下這個行,ORACLE會把整行移到另一個數據塊,而在原來的塊中保留一個指向這個新資料塊的指標。
如果PCTFREE的值太大,記錄又可能很長,這會引起行連結(ROW-CHAINING),同時空間利用率也不高;
Row Chaining在初次insert時發生,如果記錄大小超過了整個block可用大小,那麼記錄將會跨越多個block。- PCTFREE的值太大,block的可用於insert的空間就小,so...
如果PCTFREE的值太小,會影響塊資料記錄的增長,容易引起行遷移(ROW-MIGURATING);
Row Migrating在update的時候發生,一條原來儲存在一個block中的記錄由於更新而發生記錄長度變大的時候,需要使用block中的空閒空間,如果空閒空間不夠,那麼整條記錄會全部遷移到一個新的block中。- PCTFREE的值太小,block可用於update的空間就小,so...
pctused的值關係到block是否進入freelist,低於pctused的進入。
如果pctused過大,那麼可能僅僅是刪除了一點兒內容,這個block就又重新被標誌為free了,當又增加了一點兒內容(達到了1-pctfree的值),又被從freelist中摘除,頻繁操作freelist是影響效能的。
如果pctused過小,那麼即使刪除了很多內容,也許這個block仍然不被放到freelist中也就仍然不能被用於insert新資料,所以空間浪費。