Oracle8i 與Oracle9i 中對pctused 和pctfree, pctincrease 的理解

tolywang發表於2007-06-21

以下是對pctused 和pctfree 的一些理解和問題 ,不對之處望指正 。


1. pctused 和pctfree 是資料庫表的引數 ,pctused 設定表每個資料庫塊的最低使用空間比率 (預設為40, 即40%) , pctfree 設定表中每個資料庫塊所要保留的剩餘空間的比例,用於日後資料更新之用,預設的值為10,即10% 。




2. pctused 和pctfree 的理解: 當一個表中的資料塊從開始用到使用30%,這時候沒有達到最低空間使用比率,這個資料塊在資料插入時,仍然是可以儲存資料的一塊空間,也就是說還可以插入 ( 當然這個時候其他還沒有被使用的資料塊也可以用於插入這筆資料,不知道Oracle是按照什麼原理來區分將這筆資料插入那塊已經使用30%的資料塊還是插入還沒有被使用的那個資料塊 ? ) 。


3. 當這個資料塊利用到40% 的時候,仍然可以插入資料,假設現在插入資料到了80% 塊空間大小,這時也可以插入資料,因為還沒有達到90% 限制點,但是如果現在我們從80%的資料中刪除掉一些資料(比較小量), 利用率變為50% , 由於我們刪除的資料行可能是相互離散的,那麼oracle不能釋放這部分 ( 80% - 50% = 30% ) 空間,那麼現在的空間利用為50%,30% 不能再利用,那麼再使用10% 就達到了90%限制點 。 一個數塊中就可能有30% 的空間被浪費,如果日後永遠不會更新, 那麼浪費的空間就是30%+10% = 40% 的資料塊空間 。

------- 當沒有達到pctfree的值時,如果刪除了資料,這些空間仍然可以繼續使用。只有達到或者超過pctfree的值,pctused才會起作用,這時delete操作釋放的空間不會再被insert使用。 也就是說要低過pctused以後,block才會重新被列入到freelist,才會用來insert新的行; 9i中segment mangement 為auto時,pctused已經不起作用了。

4. pctfree 設定問題: 對於經常更新的表,需要設定較大的pctfree, 防止出現連結行,也就是跨塊儲存的行,10是預設值,據我們的實際觀察,對於經常更新的表,10 基本上是不夠的 ( 當然這要看儲存的行中各列大小是否會變 ), 如果不同時間插入或更新的列大小變化比較大,比如一行資料 其中一列名為 “備註“, 經常被更新,有時候從空update 到 500 bytes甚至更大,這樣就比較容易發生chained row 。 但是設定的太大感覺浪費比較大,比如pctfree=30% ,那麼這30% 就鐵定不能被使用( 如果日後不對它update的話 ),不知道如何找到平衡點 ?

-------根據應用的不同,區分經常更新的表和資料比較穩定的表。根據表更新的程度和表中的欄位型別(如非空的char型別的更新不會發生變化)對於不好估計的表,你可以根據表的資料量的大小去評估——儲存空間的佔有和效率那個更加重要一些。



5. pctincrease 僅僅是針對tablespace 而言的,具體的理解
http://www.itpub.net/showthread.php...15&pagenumber=1 討論的比較清楚 。

----- pctincrease不只是針對表空間的,一樣可以對錶進行設定。不過一般來說,對錶設定為0。目前我還沒有發現對錶設定為非0值有任何好處。

6. Oracle9i 中用local manager好像不再需要 pctincrease 這個引數了,但是還是可以設定 。
Oracle9i 文件中看到的:
The storage parameters NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS, and DEFAULT STORAGE are not valid for extents that are managed locally 。 預設值的應該和oracle8i 中一樣 。

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

相關文章