Oracle中關於PCTFREE和PCTUSED的說明

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的 性能,出現更新緩慢)。

 

下面是一個形象的比喻,可以參考理解下:

把BLOCK 想成一個水杯。侍者把水倒入放在我們面前的水杯,要多滿呢,我們要求他倒 9 分滿好了,這時候 PCTFREE 代表著設定為 10 ,意思就是說,當 BLOCK 使用到達 90% 的時候,就不可以在使用了,這個 BLOCK 應該從 FREELIST 列表中移除 (un-link) 。為何要保留 10% 的空間呢?這是為了提供 update 資料時所可能增加的空間使用,如果空間保留的太小,就容易發生 row chaining 。

PCTUSED 代表著這杯水什麼時候可以添加,假設 PCTUSED 為
40 ,代表當我們把水杯的水喝到剩下 40% 以下時,侍者就會知道需要加水了。你想想看,如果說在餐廳裡妳每喝一口水侍者就來加水,你會不會覺得很煩,對餐廳來說,也要派很多人不斷幫每桌客人加水,這生意還能做嗎?所以說, PCTUSED 代表著 re-link 回 FREELIST 的意義,如果說 PCTUSED 設的太大,例如 70 好了,代表這杯水你隨便喝一口侍者就要來加水了,這隱含的意義是,這個杯子的利用率增加,但是侍者頻繁的服務造成了負荷 (I/O Overhead) 。 PCTUSED 設小一點,例如 10 ,代表當水喝到剩下 10% 的時候 ( 如同 DELETE 事務操作 ) ,才須要放回 FREELIST ,代表可以加水了 ( 如同 INSERT 事務操作 ) 。

簡單的說,如果希望儲存空間發揮最大使用效益,可以把PCTUSED設大一點,相反的,如果想要提高IO效能,應該把PCTUSED設定小一點。

發佈了19 篇原創文章 · 獲贊 15 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章