用於資料區塊最佳化的兩個參數:pctfree和pctused一般都是用在OLTP系統當中。兩者並沒有相互的關係,當滿足其中一種條件的時候,就會被出現/移除free-list列表當中。
Oracle自動管理塊空閑空間的條件:當一個插入或者更新操作的行在一個資料區塊中有足夠空閑空間,並且這個空閑空間片段狀態,無法滿足一行資料的使用。Oracel不總是自動整理片段(合并空閑空間)的原因是,這回導致一定的系統資源開銷。
pctfree:當資料區塊中的資料量達到這個值將不允許繼續插入資料
pctused:當資料區塊中資料佔用空間小於這個比例時,資料區塊會被再次使用
行串連:指一行儲存在多個塊中的情況,這是因為該行的長度超過了一個塊的可用空間大小,即行連結是跨越多塊的行。一般是Insert操作時候。
行遷移:指一個資料行不適合放入當前塊而被重新置放到另一個塊(那裡有充足的空間)中,但在原始塊中保留一個指標的情形。原始塊中的指標是必需的,因為索引的ROWID項仍然指向原始位置。一般是update操作的時候。
PCTFREE:為一個塊保留的空間百分比,表示資料區塊在什麼情況下可以被insert,預設是10,表示當資料區塊的可用空間低於10%後,就不可以被insert了,只能被用於update;即:當使用一個block時,在達到pctfree之前,該block是一直可以被插入的,這個時候處在上升期。
PCTUSED:是指當塊裡的資料低於多少百分比時,又可以重新被insert,一般預設是40,即40%,即:當資料低於40%時,又可以寫入新的資料,這個時候處在下降期。
一、計算公式:
PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space
SQL> select table_name,AVG_ROW_LEN from user_tables where table_name in ('TAB1','TAB2');
二、舉例說明
假設你一個塊可以存放100個資料,而且PCTFREE 是10,PCTUSED是40,則:不斷的向塊中插入資料,如果當存放到90個時,就不能存放新的資料,這是受pctfree來控制,預留的空間是給UPDATE用的。
當你刪除一個資料後,再想插入個新資料行不行?不行,必須是刪除41個,即低於40個以後才能插入新的資料的,這是受pctused來控制的。
注意:如果資料表空間上啟用了ASSM,在建立表的時候,只能指定PCTFREE,否則可用指定PCTFREE和PCTUSED。
三、調整pctfree與pctused
1、通過user_tables的pct_free,pct_used來查看
select a.table_name, a.pct_free, a.pct_used, a.* from user_tables a;
說明:
pctfree表示用於保留更新操作的百分比,如果超過該值不能插入資料。
pctused表示資料所佔最低百分比,如果達到pctfree時不能插入,delete後如果達到pctused才可以用來insert
2、如果你使用的是自動管理資料表空間pctused不需要設定
altertable tablename pctfree values;
說明:
pctfree預設是10,主要看更新的資料有多大,可以查看錶的max_row_len如果很大又頻繁更新可以考慮增加該值。
pctused主要看刪除資料的大小,如果很大可以調大該值,如果不是很頻繁可以設定小一些30-40
pctused+pctfree<90
3、查看自動管理資料表空間
select tablespace_name,segment_space_management from user_tablespaces; --segment_space_management為auto表示自動管理資料表空間
主要起到節省資料表空間的作用。
4、pctfree和pctused的使用
較高的pctfree的值大約在20到25之間,較低的值為4或5,可用於靜態表或唯讀表。
除非要嚴格地管理可用空間,否則不要設定pctused超過40或50。
一般這兩個值地和不能達到90,否則會使Oarcle將更多地時間花費在處理空間利用上。下面是幾個參考:
pctfree 5,pctused 40 適合於靜態表或唯讀表。
pctfree 10,pctused 50 適合插入行後,更新活動不會增加已有行地長度地綜合性OLTP系統。
pctfree 20,pctused 40 適合於插入行後,更新活動會增加已有行地長度地OLTP系統。