建立表時引數PCTFREE和PCTUSED詳解

passion_of_data發表於2011-06-20

建立表時引數PCTFREE和PCTUSED是什麼意思?
pctfree:用於指定BLOCK中必需保留的最小空間的比例。
pctused:為一個百分比數值,當BLOCK中已經使用的空間降低到該數值以下時,該BLOCK才是可用的,達到或是超過這個數值的BLOCK是不可用的。
一般在控制具有獨立segment結構的物件時,使用這兩個引數來控制BLOCK的儲存管理
initrans:指定可以併發操作該表的事務的數目。
 
用CREATE 命令的PCTUSED、PCTFREE、INITTRANS、MAXTRANS、FREELIST GROUPS 和FREELISTS引數來控制表、索引或簇的資料塊中的空間使用。

可使用PCTFREE和PCTUSED引數控制資料塊何時進入或離開表、索引或簇的可用清單。使用PCTFREE引數設定最大的閾值,以控制對將來的行的更新操作保留多少資料塊空間。當某個資料塊使PCTFREE裝滿時,ORACLE從相應段的可用清單中刪除該塊。如果你預計只有很少的更新操作會增加行的大小,則可將PCTFREE設定為較低的值(如5或者10),使得ORACLE填滿每個塊的更多的空間。但是,如果你預計更新操作將會經常增加行的大小,則將PCTFREE設定為較高的值(如20或30),使得ORACLE為已有行的更新操作保留更多的塊空間;否則,將出現行鏈。

可使用PCTUSED引數設定最小塊的閾值來控制一個資料塊應在何時放回到相應段的可用清單中。例如,所有段的預設PCTUSED設定為40%,因此,當事務處理刪除資料塊中的行時,如果它只有39%是裝滿的,ORACLE將該資料塊放回到相應段的可用清單中。如果你預計很少有刪除操作,則可設定PCTUSED為較高的值(如60),當偶然的刪除操作發生時,使資料塊彈出可用清單。但是,如果你預計將PCTUSED 設定為較低的值(如40),使ORACLE不常產生塊在表的可用空間中移進或移出的開銷。

可使用INITRANS和MAXTRANS引數優化ORACLE如何在表、資料簇或索引的資料塊中分配事務處理項。INITRANS引數確定為事務處理項預分配多少資料塊頭部的空間。當您預計有許多併發事務處理要涉及某個塊時,可為相關的事務處理項預分配更多的空間,以避免動態分配該空間的開銷。MAXTRANS引數限制並行使用某個資料塊的事務處理的數量。當您預計有許多事務處理將並行訪問某個小表時,則當建立表時,應設定該表的事務處理項預分配更多的塊空間,較高的MAXTRANS 引數值允許許多事務處理並行訪問該表INITRANS和MAXTRANS 引數的設定可能相應低一些(如分別為2和5)。使用這樣的設定,很少為事務處理項保留窨,使該表資料塊的更多空間用於資料。

可使用STORAGE子句的FREELIST GROUPS 引數控制段的可用清單組的資料量。使用FREELISTS 引數設定每組中可用清單的數量。

 

Oracle 空閒列表管理機制與pctfree和pctused引數 
Oracle中有空閒列表的概念.空閒列表中儲存的是可供插入新行的塊資訊
所以新的行資料只會插入到那些存在於空閒列表中的塊. 
空閒列表的管理機制與建表時pctfree和pctused引數兩個引數有緊密關係. 
當一個塊第一次開闢的時候,當然是在空閒列表中的.
隨著不斷地插入行資料,當使用率達到或者超過 1-PCTFREE%的時候,該塊從空閒列表中移出.
所以這時候新的行資料不可能再存放到該塊中. 那這個剩餘的PCTFREE%部分豈不是浪費了,當然不是了. 
隨著UPDATE 活動的增多,某些存在該塊中的行資料的就會變大,變大部分的資料就存放在PCTFREE部分中.

Delete活動,會將行資料從塊中抹去,這時候塊的使用率可能會低於1-pctfree%, 但是該塊還是不會
立即回到空閒列表,也就是該塊這時候不會接受新的行資料. 那什麼時候該塊會重新回到空閒列表中呢?
直到該塊的使用率低於PCTUSED%的時候,才會回到空閒列表中,也就是說這時候可以接受新的行資料了.

所以當你的系統有較多的update活動並且行資料的大小變化較大的時候,應該預留較多的pctfree.
例如一個公文審批系統,一個公文在流轉的過程中,資料在不斷地變大。
對於一個沒有update活動的表,可以將其設定為0.如系統中的組織架構表,更新的可能性幾乎為0。

如果你想充分地利用塊,則將PCTUsed 設定地高一點,以便在發生Delete活動後,快速地回到空閒列表中.

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

相關文章