block學習(pctfree&pctused),行遷移問題(zt)

tolywang發表於2007-12-29

說到block大家都應該知道,block是最小的儲存單位

Oracle讓你選擇的block size包括2K, 4K, 8K, 16K, 32K,那麼我們應該如何選擇block size呢?
對於block size的選擇完全取決於應用模式。如果應用中以較小的隨機讀取為主,選擇比較小的block size就比較有利。如果應用以大量的連續讀寫為主,則一般傾向於是用大的block size。所以我們經常會看到在OLTP的系統中選用4k~8K的block size, 而在DW裡面多采用16K或更大的block size。另外我們總是希望表的一行可以儘量儲存在一個block裡,這有時也可以成為一個考慮的理由。


ITL:Interested Transaction List,這部分影響block的concurrency能力, ITL實際就是放在block header的一段資料,稱為ITL slot。每個slot都是這個block上的transaction的入口,也就是說,如果這個block上有10個ITL slot,那麼在這個block在同一時刻最多允許的transaction數量是10。

ITL的個數由儲存引數inittrans和maxtrans,一般在create table (index)時設定, 相信你已經猜到了, inittrans就在一個初始的block上的slot個數, maxtrans則是這個block上最大的slot個數,預設設定( inittrans =1, maxtrans =255)基本上對大多數情況都是適用的。由於ITL slot本身佔用空間並且需要管理,所以盲目增大inittrans並不可取,預設的maxtrans =255已經很大了,很少有應用會在同一時刻在單個block上產生255個事務。

一般來說,預設的ITL的設定是比較合理的,但是不要忘記,在Oracle裡面沒有萬能的設定,在我們case裡的預設的inittrans =1, maxtrans =255是有問題的

到此為止,在這一章我們瞭解了2個影響concurrency的item(東東):ITL和free list,希望大家不會把他們搞混。(所謂concurrency,就是你可以在同一時間同一地點做同一件事的能力)ITL和free list的區別包括:
1. 影響的地點不同:ITL影響在block層面上的concurrency,free list影響在segment層面上的concurrency
2. 影響的事情不同:ITL影響的是併發的事務,而free list影響的是併發的insert。
3. 影響的時間不同:一個block上的事務是在整個事務期間佔用一個ITL slot,當事務結束後釋放。而一個insert只是在insert之前尋找free block的時候佔用free list,找到了之後就不佔用了。佔用的時間相對ITL來說是很短的。其實就好像我們去看電影一樣,首先去買票,這就好像在電影院裡找free的位置,儘管買票的動作一般很快,如果同時很多人買票的話,電影院最好多開幾個售票點。當我們進入影院,做到位置上,我們在整個看電影的過程都佔著這個位置。這裡面售票點就像free list,裡面的位置就像ITL slot。


現在我們知道了free list是為insert提供一個可用的free block列表,問題是怎樣的block算是’free’的呢------也就是說,Oracle根據什麼標準來判斷block是否free enough並藉此維護free list。

我們是透過在create segment (create table/index) 時候指定pctfree和pctused這兩個儲存引數,我們設立這個標準。Pctused是用來把block放到free list上面去,pctfree是用來把block從free list拿下來。按照這兩個引數的預設設定pctused=40, pctfree=10,當一個block的使用率降到39%,這個block會被放到free list上,接受insert,隨著block裡資料的增加,當使用率升到高於90% (free space < 10%),這個block將會從free list拿下來。這時候這個block不允許新的insert,只允許update和delete。相信大家知道:insert 提高使用率,delete降低使用率,而update則既可能提高也可能降低。Pctused和pctfree不能設定的太接近,比如pctused =89,pctfree=10,這種情況下segment裡的block就會不停的加入free list,再馬上從free list拿下來,這會導致free list上的爭用很嚴重。

對於free list和free list group的設定,如果設定太小,在高度併發insert的時候free list上會產生爭用,設定的太大會導致空間的浪費和額外的管理開銷,所以如何設定首先是充分理解,然後就是監控,調整,監控,調整的過程。

假設pctfree=10, pctused=40,這就表明當一個Block的空間使用率達到了90%(100-pctfree)時,這個block就不再允許被用於新增資料(insert),而保留下來的這10%的空間則被預留為行更新(update)所可能需要的空間擴充套件,我們說此時這個block就從freelist上被摘走了(實際上還有另外一種情況,就是當塊剩餘空間不足以插入一條記錄並且該塊的使用率已經超過了pctused定義的值並且該塊位於freelist header處時,該塊也會從freelist上被摘走,術語稱為UNLINK)。當有資料刪除(delete)的時候,只有該block中的資料被刪除到一定的程度,該塊才會重新被加入到freelists中,而這個程度就是pctused引數定義的數值,如我們這個例子中,只有塊中的資料降低到40%以下的時候,該塊才被重新允許用於新增資料。透過上面的描述,可以知道所謂freelists,就是一個指定了所有可以用於insert操作的資料塊的列表。存在在這個列表中的資料塊才能用於insert操作,一旦一個資料塊無法用於insert(達到了pctfree引數指定的限度)則立刻從這個列表中被摘除。freelists的作用就在於管理高水位標誌(HWM)以下的空閒空間。
注意:freelists只是管理高水位標誌以下的空閒空間,而實際上一個segment可用的空閒空間包括兩種型別:
1. 已經分配給這個segment但是從來未被使用過的位於高水位標誌之上的blocks
2. 位於高水位標誌之下,被連結在freelists上的blocks

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

相關文章