Oracle中關於PCTFREE和PCTUSED的說明

jackson198574發表於2011-08-07
PCTFREE:塊中保留用於UPDATE操作的空間百分比,當資料佔用的空間達到此上限時,新的資料將不能再插入到此塊 中;

      PCTUSED:指定塊中資料使用空間的最低百分比;當一個塊在達到PCTFREE,之後經歷了一些DELETE操作,在其空間使用下降到PCTUSED 後便可以重新被用於INSERT資料;這就是PCTFREE/PCTUSED引數的含義;

      調整PCTFREE、PCTUSED引數的目標一方面是提高效能,另一方面則主要是提高空間使用效率,避免出現塊中存在有許多未用的空間,但卻無法找到一 個塊可以被用於插入新資料行的情況發生。

     PCTFREE的使用

     在Oracle中 表的每一行資料由唯一的ROWID標記;而Oracle支援的資料型別中有一些長度是可變的,如VARCHAR,當對 這些資料進行UPDATE時,如果塊中的可用空間不能容納UPDATE後的資料行時,Oracle將會把此行移到其它資料塊,同時保留此資料行的 ROWID不變,並在原有塊中建一指標指向行遷移後的位置。在這種情況下讀取一行資料將需要訪問2個資料塊,從而導致效能下降。PCTFREE保留的空間 就是為確保更改後的資料行可以仍存放於原有資料塊中,避免行遷移的情況發生。 由此,如果PCTFREE設定不足時可能產生行遷移;而另一方面如果PCTFREE設定過高,將會造成空間浪費。因此正確設定PCTFREE需要對錶中數 據的使用進行分析。對於資料長度不會變化或極少更新的情況,可以採用較小的PCTFREE;對於其它大多數情況應採用稍大的 PCTFREE(PCTFREE的預設值是10,如果不好估計需預留的空間,可以使用15-25的範圍),不要為節約塊中的空間而使用較小的 PCTFREE值。

      PCTUSED的使用

      當塊的使用的空間下降到PCTUSED後,此塊被重新放回空閒連結串列(Freelist) 中,作為後續Insert的候選塊。同樣,設定PCTUSED需要視資料行的特性和Insert、Update、Delete的模式而定,但必須遵守的原 則是:db_block_size * (100 - PCTFREE - PCTUSED)必須比行的長度大。 對於資料行長度變化較大的情況,應使用最大行長度來計算PCTUSED,並且應使用較低的PCTUSED值。因為在執行Insert時,如果資料塊的可用 空間不能裝下一行資料,當塊的使用的空間是在PCTUSED之上,Oracle將把此塊從Freelist中移走;當塊的使用的空間是在PCTUSED之 下,Oracle將會擴充套件段空間。因此,PCTUSED如果設得過高,將導致段的不斷擴充套件。 當資料行長度不大時,使用預設的PCTUSED(40)是比較合適的;對於行長度較大的情況,最長的行有可能會佔用半個以上的塊空間,此時可設定 PCTUSED為10。較小的PCTUSED僅在表中的資料以隨機方式被刪除,而且仍有一些行長時間保留在塊中時,才會造成空間使用上的問題,因為這些塊 可能需要較長的時間才能或永遠不能重新被用於存放新資料。在這種應用中,如果空間利用率一直處於較低水平,則需對PCTUSED進行分析和調整。

    pctfree引數是控制freelist un-links的(即將塊由freelists中移除)。設定pctfree=10 意味著每個塊都保留10%的空間用作行擴充套件。pctused引數是控制freelist re-links的。設定pctused=40意味著只有在塊的使用低於40%時才會回到表格的freelists中。
----------------

     PCTFREE和PCTUSED的概念: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的 效能,出現更新緩慢)。

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

相關文章