pctused, pctfree, pctincrease , 行遷移 & 行連結

tolywang發表於2009-02-19

雖然以前都有理解這些概念,但是今天偶爾看看網上的一些討論,發現還是有一些不知道的東西 。

-------------------------------------------------------------- 


關於pctincrease與空間碎片回收的幾點看法


1.PCTINCREASE>0 的時候SMON 會自動合併表空間中的碎片,等於0的時候只能手工回收
2.PCTINCREASE>0 造成extent不一致甚至可能因為幾何增長的緣故造成一個next需要的餓空間太大
3.固定的next且較小可能造成表的儲存段太離散,對查詢很不利

我的意見是碎片能合併(回收)但是並不等於能利用:

而造成碎片的原因是因為表的儲存的段離散而extent不一致所造成的
一旦PCTINCREASE>0 ,如果next較多會造成很多問題
你就算能合併碎片,但是這些空間也不能很好的利用,甚至很肯能利用率比較底

很簡單的一個例子:
3+4=7 這是smon合併相臨碎片 ,但是這時由於PCTINCREASE>0 的原因,有可能的話,
next extent已經為5了, 那麼,7-5=2這部分就幾乎永遠浪費了(除非重建表空間)

所以,儘量保持在表空間所有表的next一致,然後PCTINCREASE=0
這樣,就算smon不自動合併臨近的碎片,這些碎片也能重複利用
如果能定期的手工合併,那當然也是可以的

注意: 這裡所說的碎片完全是指表truncate或者drop後釋放出來的空間
不是delete後留下來的空間,smon是不能解決delete所浪費的空間 

 

能讓表釋放空間只有3種情況:
1)drop table.........
2)truncate table .....drop storage....把表的資料刪除只剩一個表頭
3)alter table ..... deallocate unused  改變表的高水位

 


如果在表裡刪除一些行,然後往這個表裡insert,當然會利用delete出來那些空間
為什麼delete不能釋放空間?
道理很簡單,oracle下為物件分配儲存空間是以extent作單位的,你刪除的行可能是梅花插竹互相隔離的,如果每個block都有一些行刪除了,也有

一些沒刪除的,你要oracle怎麼釋放(塊是操作最小單位)?如果每次delete的時候都要oracle去檢查一下有沒有一個完整的範圍可以釋放,這又要

消耗額外的效能,而且是沒必要的(因為能釋放的機會太低了)

 

SMON 合併相鄰碎片只針對tablespace的default storage。不針對table storage .

 

 

 


------------

Oracle9i 下忽略掉pctused , pctfree仍然有效,是因為9i下可以支援ASSM(auto segment space manangement),
導致pctused 失效, 相當於有多個pctused , 使用點陣圖標示 2bit , 25%, 50%, 75% 等 。


------------

 


pctused =40 , 實際使用空間<40% , 可以用該塊插入資料。
pctfree =10 , 插入資料到剩餘空間只有10%時 , 不能在該塊插入資料。 

 

行連結: 行連結產生在第一次插入資料的時候如果一個block不能存放一行記錄的情況下。
、這種情況下,Oracle將使用連結一個或者多個在這個段中保留的block儲存這一行記錄,
比較容易發生在比較大的行上。比如Long, LOB等。
只能增大 db_block_size 來清除行連結 。

 

行遷移: 當一行記錄初始插入的時候事可以儲存在一個block中的,由於更新操作導致行長增加了
,而block的自由空間已經完全滿了,這個時候就產生了行遷移。在這種情況下,Oracle將會遷移整
行資料到一個新的block中(假設一個block中可以儲存下整行資料),Oracle會保留被遷移行的原始
指標指向新的存放行資料的block,這就意味著被遷移行的ROW ID是不會改變的。
pctfree設定過小是導致行遷移的一個原因。設定太大可能導致空間利用率低下 。

 

 

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

相關文章