關于Freelists和Freelist Groups的研究(修訂版)- 有多少種free list
四. 有多少種 free list 1. master free list或者segment free list 簡稱為MFL,在segment被創建的時候自動生成的,如果我們在創建segment時沒有指定freelists參數,或者指定freelists=1,都是生成這個MFL。MFL對于每個segment來說有且只有一個(如果指定f
四. 有多少種free list
1. master free list或者segment free list
簡稱為MFL,在segment被創建的時候自動生成的,如果我們在創建segment時沒有指定freelists參數,或者指定freelists=1,都是生成這個MFL。MFL對于每個segment來說有且只有一個(如果指定freelists>1,產生的就是不是MFL,這一點將在process free list部分解釋)。MFL相當于一個空閑空間池,當一個segment被創建時的初始化block以及以后動態分配的新block都鏈接到MFL中,這個池中的所有空閑塊是被所有進程共享的,對于該segment有insert操作的所有進程都可能會去讀取這個free list,這樣當有多個進程要同時insert數據時,就可能出現在MFL上的爭用(MFL在一個時間只能允許一個進程取得空閑塊,當然,其實進程從MFL上讀取空閑塊的操作并不是簡單地需要多少就取多少,取得以后就直接向塊中插入數據,實際上的過程要更復雜一些,這個過程在“進程請求空閑塊的過程”部分會有詳細描述)。由此,推出了freelist groups的概念,設置freelist groups參數大于1就是設置了多個MFL,這樣就緩解了對于MFL的爭用。有關freelist groups更詳細的內容在“Super Master Free list”部分會有描述。
2. process free list
如果進程必須直接從MFL中讀取空閑塊,那么對于MFL的爭用由freelist groups參數解決(設置多個MFL),但是顯然還有另外一個思路就是盡量不讓進程去直接讀取MFL,沒有
需求自然就無所謂爭用。由此引入了另外一個級別的free list,這就是process free list,簡稱為PFL。當我們指定存儲參數freelists>1的時候,生成的就是PFL。
我們前面說過MFL是在segment被創建的時候自動生成的,所以無論是不是有PFL,對于每個segment來說都仍然存在1個MFL。也就是如果我們定義freelists等于2的話,那么在segment header block中將總共存在3個freelist,其中1個是MFL,另外2個是PFL。
這一點我們同樣可以通過dump轉儲信息來驗證。
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: USED lhd: 0x01c0008b ltl: 0x01c0008b
后面兩個free list既是PFL,而前面一個則是MFL。
顧名思義,既然命名為process free list,那么顯然位于這個級別的free list中的空閑塊只能被一個進程讀取。想象一下,如果當前系統對于某張表最多同時會有10個進程同時作insert操作,那么我們設置freelists=10,將能盡量滿足每個進程都能夠使用專屬于自己的free list,無疑通過這樣的手段我們緩解了free list的爭用。
一個進程到底會使用哪個PFL,
oracle內部的算法是:(P % NFL) + 1
其中P表示DML操作進程的Process ID,可以從v$process.pid字段中取得。
NFL表示freelists存儲參數定義的PFL數量。
可能會有疑問,如果是這樣,多個MFL有存在的必要嗎?我們只需要設置多個PFL不就可以了嗎?然而事實并非如此,不過請稍安毋躁,在后面講解“進程請求空閑塊的過程”中會解釋這個問題。
3. transaction free list
在
Oracle中事務(transaction)是一個重要的概念,每次DML操作,事務的開始都是自動的,而我們可以通過commit或者rollback來標志一個事務的結束。一個進程(或者說一個用戶會話)有自己的PFL,然后一個進程可能會執行很多的事務,于是又出現了這個級別的free list,這就是transaction free list,簡稱為TFL。
TFL是動態產生的,只有當DML語句(比如delete或者update)使block占用量降到pctused參數指定值之下時才會生成TFL,一個TFL只屬于一個事務,而一個事務也只會有一個TFL,一個事務沒有提交之前,此事務的TFL上的空閑塊不會被其它事務使用。但是可以立刻被本事務使用(此時這些空閑塊被稱為previously freed blocks)。
每個segment最少可以有16個TFL,同時只要有
需求就會動態增加TFL數量,除非達到了segment header block size的限制。當沒有空間允許新的事務得到自己的TFL時,這個事務就必須等待其它的事務提交并釋放TFL。等待哪個事務的算法是:(P % NFL)
其中P表示DML操作進程的Process ID,可以從v$process.pid字段中取得。
NFL表示當前的TFL總數量。
通過dump轉儲數據塊信息,我們可以看到類似于下面的內容:
XCT LST:: flg: USED lhd: 0x01c0008c ltl: 0x01c0008a xid: 0x0008.01f.000003d2
其中xid表示transaction id,關于transaction id的格式和表示的意義,有興趣的讀者可以查看其它的
資料。
4. Super Master Free list或者Segment Master Free list
這個級別的free list只有在設置了多個freelist groups時才會出現。
當我們設置freelist group>1,就會產生freelist group block,這些block緊跟在segment header block之后,假設我們設置了storage(freelists 4 freelist groups 2),那么該segment的第一個塊是segment header block,第2,3個塊則都是freelist group block。
首先在segment header block中存在1個free list,這個free list就被稱為Super Master Free list或者Segment Master Free list。
而在每個freelist group block中又都存著1個MFL,還存在4個PFL,每個freelist group block塊的剩余空間則全部留給TFL使用。
在單個instance中進程選擇freelist group的算法是(P % NFB) + 1 。
其中P表示DML操作進程的Process ID,可以從v$process.pid字段中取得。
NFB表示freelist groups 參數定義的Freelist Groups數量。
而在RAC環境中的算法則更加復雜,本文不作討論了。
查看freelist group block的轉儲文件可以看到類似于下面的內容:
frmt: 0x02 chkval: 0x0000 type: 0x16=DATA SEGMENT FREE LIST BLOCK WITH FREE BLOCK COUNT
blocks in free list = 5
clearcase/" target="_blank" >ccnt = 0
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: USED lhd: 0x01c00116 ltl: 0x01c0011a
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|