国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > Oracle > 正文

Oracle Freelist和HWM原理探討及相關(guān)性能優(yōu)化

2024-08-29 13:31:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • 本文來(lái)源于網(wǎng)頁(yè)設(shè)計(jì)愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問(wèn)。

  • oracle freelist和hwm原理探討及相關(guān)性能優(yōu)化

    中興通訊重慶研究所 游波

     

    關(guān)鍵詞:freelist,hwm,存儲(chǔ)參數(shù),段,塊,dump,優(yōu)化

    文章摘要:

       近期來(lái),freelist的重要作用逐漸為oracle dba所認(rèn)識(shí),網(wǎng)上也出現(xiàn)一些相關(guān)的討論。本文以freelist為線索對(duì)oracle的存儲(chǔ)管理的原理進(jìn)行較深入的探討,涉及oracle段區(qū)塊管理的原理,freelist算法等。而與freelist密切相關(guān)的一個(gè)重用特性hwm,與sql性能密切相關(guān),本文也作了原理分析介紹。在原理探討的基礎(chǔ)上,介紹了常用的存儲(chǔ)參數(shù)分析方法,并對(duì)所涉及的存儲(chǔ)優(yōu)化、hwm的優(yōu)化和freelist競(jìng)爭(zhēng)優(yōu)化作了說(shuō)明。

    縮略語(yǔ):

           assm:auto segement space management

           hwm:high water mark

           dba:data block address

           oltp:online transaction process

           ops:oracle parallel server
    1.簡(jiǎn)介
           oracle的空間管理和存儲(chǔ)參數(shù)管理是oracle管理及優(yōu)化的重要部分。freelist作為oracle底層存儲(chǔ)參數(shù)中的核心參數(shù),其行為方式對(duì)oracle的存儲(chǔ)管理及性能優(yōu)化有重大影響,而現(xiàn)有的oracle文檔對(duì)此方面的內(nèi)容比較缺乏。雖然oracle 9i已出現(xiàn)了assm,但是作為深入調(diào)優(yōu)對(duì)freelist認(rèn)識(shí)仍是必要的。

       近期來(lái),freelist的重要作用逐漸為oracle dba所認(rèn)識(shí),網(wǎng)上也出現(xiàn)一些相關(guān)的討論。本文以freelist為線索對(duì)oracle的存儲(chǔ)管理的原理進(jìn)行較深入的探討,涉及oracle段區(qū)塊管理的原理,freelist算法等。而與freelist密切相關(guān)的一個(gè)重用特性hwm,與sql性能密切相關(guān),本文也作了原理分析介紹。在原理探討的基礎(chǔ)上,介紹了常用的存儲(chǔ)參數(shù)分析方法,并對(duì)所涉及的存儲(chǔ)優(yōu)化、hwm的優(yōu)化和freelist競(jìng)爭(zhēng)優(yōu)化作了說(shuō)明。

           這些原理分析和性能優(yōu)化都建立在探討的基礎(chǔ)上,限于篇幅和本人經(jīng)驗(yàn)可能存在局限、偏差或謬誤。

           為了準(zhǔn)確文中部分結(jié)構(gòu)和字段的說(shuō)明直接用英文描述。

           限于篇幅本文不對(duì)同樣很重要的block結(jié)構(gòu)作更深入的討論,對(duì)ops性能有重要影響的free list group本文也未提及,因此本文在單一free list group下討論。對(duì)于block的深入討論、free list group的介紹與優(yōu)化以及pctused和pctfree等重要參數(shù)的優(yōu)化請(qǐng)參見參考文獻(xiàn)和資料。
    2.原理探討
           freelist作為一個(gè)oracle存儲(chǔ)管理的核心參數(shù)。其行為方式由oralce內(nèi)部控制,我們一般不需要掌握和控制。但是我們可能會(huì)遇到這些問(wèn)題,當(dāng)插入一條記錄,會(huì)插入到那個(gè)塊中?是使用新塊,還是插入有數(shù)據(jù)的老塊?段是什么時(shí)候擴(kuò)展的,如何擴(kuò)展的?表中只有一條記錄,但是作一次select時(shí)代價(jià)卻是上千個(gè)塊,為什么?如果我們從原理上清楚了oracle的存儲(chǔ)管理方式,對(duì)相關(guān)這些問(wèn)題的解決及性能優(yōu)化就清晰自然了。
    2.1 oracle的邏輯儲(chǔ)存結(jié)構(gòu)
           oralce的邏輯存儲(chǔ)結(jié)構(gòu)按表空間,段,區(qū),塊進(jìn)行管理。塊是oracle用來(lái)管理存儲(chǔ)空間的最基本單元,oracle數(shù)據(jù)庫(kù)在進(jìn)行輸入輸出操作時(shí),都是以塊為單位進(jìn)行邏輯讀寫操作的。區(qū)由一系列連續(xù)的塊組成,oralce在進(jìn)行空間分配、回收和管理時(shí)是以區(qū)為基本單位的。段由多個(gè)區(qū)組成,這些區(qū)可以是連續(xù)的也可以是不連續(xù)的,一般情況下一個(gè)對(duì)象擁有一個(gè)段。表空間中容納段和區(qū)。

           在生成段的時(shí)候,會(huì)同時(shí)分配初始區(qū)(initial extents), 初始區(qū)的第一個(gè)塊就格式化為segment header,并被用來(lái)記錄free list描述信息、extents信息,hwm信息等。
    2.2 free list概念
    free list是一種單向鏈表用于定位可以接收數(shù)據(jù)的塊,在字典管理方式的表空間中,oracle使用free list來(lái)管理未分配的存儲(chǔ)塊。oracle記錄了有空閑空間的塊用于insert或update。空閑空間來(lái)源于兩種方式:1.段中所有超過(guò)hwm的塊,這些塊已經(jīng)分配給段了,但是還未被使用。2.段中所有在hwm下的且鏈入了free list的塊,可以被重用。free list具有下列屬性

    l         flag指示free list 被使用(1)或未使用(0)

    l         free list 鏈的首塊的地址dba(data block address)

    l         free list 鏈的尾塊的地址dba

    free list 的信息通常保留在segment header中,這里給出segment header block dump片段加以說(shuō)明:

    nfl = 3, nfb = 1 typ = 1 nxf = 0

    seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000

    seg lst:: flg: used   lhd: 0x03c00233 ltl: 0x03c00233

    seg lst:: flg: used   lhd: 0x03c00234 ltl: 0x03c00234

      seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000

     

    segment header:

    ==> nfl: number of free lists/block

    ==> nfb: number of free list blocks + segment header

    ==> typ: block type

    ==> nxf: number of transaction free lists

    segment list:

    ==> flg: flag used or unused the free list

    ==> lhd: head of free list

    ==> ltl: tail of free list

     

    在每一個(gè)塊中都有一個(gè)標(biāo)記flg用來(lái)表明塊是否鏈入了 free list鏈中。如果這個(gè)標(biāo)志置上,該塊中后向指針指向free list鏈中下一個(gè)塊的dba。如果當(dāng)前塊是鏈的最末尾的塊,該后向指針值為0。

    這里給出位于free list上的block dump的片段

    block header dump:  0x03c00235

     object id on block? y

     seg/obj: 0xe2d8  csc: 0x00.6264c61  itc: 1  flg: o  typ: 1 - data

         fsl: 1  fnx: 0x3c00234 ver: 0x01

     

    ==> seg/obj object id in dictionary

    ==> csc scn of last block cleanout

    ==> itc number of itl slots

    ==> flg o = on freelist , - = not on freelist

    ==> typ 1 = data    2 = index

    ==> fsl itl tx freelist slot

    ==> fnx dba of next block on freelist

     

    舉例來(lái)說(shuō)如果有五個(gè)塊在free list中,分別為a,b,c,d,e

    就會(huì)形成segment header->a->b->c->d->e--|

    同時(shí)segment header->e
    2.3 free list類別
    在段中存在3類free list, 即master freelists (mfl), process freelists (prfl), 和 transaction freelists.
    2.3.1 master free list(公用空閑空間池):
    每一個(gè)段中有一個(gè)master free list,在段創(chuàng)建的時(shí)候自動(dòng)生成。對(duì)于每一個(gè)段來(lái)說(shuō)都有這樣一個(gè)空閑空間池,對(duì)每個(gè)進(jìn)程都是公用的,空閑空間就是位于master free list 的塊上。由于master free list是公用的,因此當(dāng)多個(gè)進(jìn)程同時(shí)插入行到同一個(gè)段上,master free list競(jìng)爭(zhēng)使用程度就會(huì)增加。
    2.3.2 process free lists
    為了減少master free list的競(jìng)爭(zhēng)問(wèn)題, 引入了另一種free list叫做process free lists, 根據(jù)sql命令 create/alter 中的參數(shù)freelists 創(chuàng)建. 這樣多個(gè)free list 就可以分?jǐn)偪臻e空間的管理,以提高oltp應(yīng)用作高度并發(fā)插入和更新事務(wù)時(shí)空間分配管理的性能。通過(guò)指定create table / cluster or index的子句storage的參數(shù)freelists 來(lái)創(chuàng)建,例如: create table flg ( . . . .) . . . storage ( ... freelists 10 ...)。缺省的freelists為1,此時(shí)不會(huì)創(chuàng)建process free lists。當(dāng)freelists>=2時(shí),創(chuàng)建process free lists。

        進(jìn)程在使用process free list是根據(jù)進(jìn)程的oracle pid (process id)來(lái)選擇的,公式如下:

    select list entry = (pid % nfl) + 1

    nfl : freelists定義的process free list個(gè)數(shù)
    2.3.3 transaction free lists
    當(dāng)oracle需要時(shí)動(dòng)態(tài)創(chuàng)建。一個(gè)transaction free list 是一種專門給某一個(gè)事務(wù)使用的free list. 每個(gè)段至少有16個(gè)transactions free lists, 并且這個(gè)值在需要時(shí)會(huì)增長(zhǎng),直到達(dá)到segment header塊的大小限制。一個(gè)事務(wù)只有下面情況下會(huì)需要分配一個(gè)tx free lists entry: 塊中釋放空間時(shí)(delete or update) 并且還不存在tx free lists entry時(shí)。
    2.4 free list行為2.4.1 freelist link and unlink 操作
        freelist 按后進(jìn)先出隊(duì)列(lifo) 方式管理。也就是說(shuō)最后被link到freelist的塊擁有最先unlink的機(jī)會(huì)。

    當(dāng)塊中空閑空間增加到大于pctfree時(shí),塊放入freelist中。free list中的塊可用來(lái)作update 或insert。 當(dāng)塊中沒有足夠的空間用于insert操作時(shí)并且使用空間大于pctused,塊就會(huì)從free list中移出。

    在塊在delete or update 操作之后,如果使用空間落到pctused下,塊再次link到free list中。每次塊加入free list時(shí),都是link到鏈表的頭部。

    例如:考慮段中有120個(gè)塊編號(hào)由1到120。其中有6個(gè)塊在free list上并假設(shè)hwm是 80。(block實(shí)際使用dba編號(hào))

    10->24->45->46->65->80-|

    現(xiàn)在作insert 操作,需要400 bytes空間。假設(shè)塊10上空間不足,但塊24上空間可用。現(xiàn)在數(shù)據(jù)插入到塊 24 ,現(xiàn)在塊24的剩余空間小于該表的pctused。因此塊 24 從free list鏈表中移出。pctfree and pctused參數(shù)的目的就是用來(lái)控制數(shù)據(jù)塊從free list的鏈表中移入/移出行為的。現(xiàn)在free lists象這樣:

    10->45->46->65->80-|

    然后在同一事務(wù)中作delete同一個(gè)段的數(shù)據(jù),使塊 54 和 67落到pctused下。現(xiàn)在這些塊加入到free list鏈中。free list鏈現(xiàn)在象這樣:

    67->54->10->45->46->65->80-|
    2.4.2 transaction free list 算法
    掃描segment header塊中所有的tx free list,檢查是否還沒有tx free list entry分配給transaction, 如何沒有,將尋找未使用的entry或已經(jīng)提交了事務(wù)的空的tx free list。如果上述搜索過(guò)程失敗, 新的entry會(huì)在segment header塊中tx free lists區(qū)域中開辟。如果沒有空間來(lái)生成, 事務(wù)就必須等待entry的釋放。

    segment header中的最大free list個(gè)數(shù):

    block size    max # freelists

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

          2k      24

          4k      50

          8k      101

         16k      204

    事務(wù)t1釋放出來(lái)的空閑塊(delete or update)的使用 :

    l         立即被t1所重用

    l         當(dāng)t1 commit后被其它需要空閑塊的事務(wù)重用,過(guò)程舉例如下:



     
    2.5 hmw概念
    high water mark代表一個(gè)表使用的最大的(top limit)塊 。2.1中已經(jīng)提到high water mark 記錄在segment header中,并且在oracle插入數(shù)據(jù)時(shí)一般增長(zhǎng)5個(gè)blocks(并非總是5個(gè)塊,具體參見2.4.2中流程圖中hmw增長(zhǎng)方式)。

    segment header block中與hwm相關(guān)信息說(shuō)明如下:

    extent control:

      extent header:: spare1: 0      space2: 0      #extents: 13     #blocks: 1429 

                      last map  0x00000000  #maps: 0      offset: 4128 

          highwater::  0x020004d0  ext#: 12     blk#: 275    ext size: 475  

      #blocks in seg. hdr's freelists: 5    

      #blocks below: 1229    

      mapblk  0x00000000  offset: 12   

                       unlocked

    ==> spare1:   this field is no longer used (old inc#, now always 0)

    ==> space2:   this field is no longer used (old ts#, now always 0)

    ==> #extents: number of extents allocated to segment

    ==> #blocks:  number of blocks allocated to segment

     

    ==> last map: address of last extent map block

                  0 if extent map is entirely in the segment header

    ==> #maps:    number of extent map block

    ==> offset:   offset to end of extent map

     

    ==> hwm dba:  address of block at highwater mark

    ==> ext#:     hwm extent number relative to segment

    ==> blk#:     hwm block number within extent

    ==> ext size: hwm extent size (in blocks)

    ==> #blocks in seg. hdr's freelists: number of blocks in seg. hdr's free list

    ==> #blocks below: number of blocks below hwm

    ==> mapblk dba: dba of extent map block containing hwm extent

                    is 0 if hwm is in the segment header

    ==> offset:   offset within extent map block

                  is the ext# if hwm is in segment header

    ==> locked by: if locked by a transaction, the xid is displayed

     

    hwm可以說(shuō)是已經(jīng)使用過(guò)的存儲(chǔ)空間和未使用過(guò)的存儲(chǔ)空間之間的分界線。在表使用過(guò)程中,hwm一直向一個(gè)方向移動(dòng),插入記錄時(shí)hwm可能會(huì)向增加的方向移動(dòng),但是刪除記錄時(shí)hwm并不會(huì)向相反的方向移動(dòng)。參見2.4.2。下圖顯示了某個(gè)數(shù)據(jù)段中hwm的位置情況。



    圖2.5

    high water mark之所以重要是因?yàn)樗鼘?duì)全表掃描性能的影響。當(dāng)實(shí)施一個(gè)全表掃描時(shí),oracle會(huì)讀取所有high water mark下的塊即使它們是空塊。當(dāng)high water mark 下有很多unused block時(shí)實(shí)施全表掃描會(huì)增加額外的不必要的i/o。它也會(huì)在全局共享區(qū)中填充很多很多空塊。

     
    3.分析方法
        存儲(chǔ)參數(shù)基本上屬于oracle internal的東西,因此oralce并沒有提供很好的手段來(lái)分析。但是對(duì)于dba來(lái)說(shuō),還是可以通過(guò)block dump和dbms_space等手段來(lái)獲取部分信息。
    3.1 提取block和free list信息
    創(chuàng)建dbms_space使用的存儲(chǔ)過(guò)程show_space

    sql>

    create or replace procedure show_space

     ( p_segname in varchar2,

     p_owner in varchar2 default user,

     p_type in varchar2 default 'table',

     p_partition in varchar2 default null )

     as

     l_free_blks number;

     l_total_blocks number;

     l_total_bytes number;

     l_unused_blocks number;

     l_unused_bytes number;

     l_lastusedextfileid number;

     l_lastusedextblockid number;

     l_last_used_block number;

     procedure p( p_label in varchar2, p_num in number )

     is

     begin

     dbms_output.put_line( rpad(p_label,40,'.') || p_num );

     end;

     begin

     dbms_space.free_blocks

     ( segment_owner => p_owner,

     segment_name => p_segname,

     segment_type => p_type,

     partition_name => p_partition,

     freelist_group_id => 0,

     free_blks => l_free_blks );

     

     dbms_space.unused_space

     ( segment_owner => p_owner,

     segment_name => p_segname,

     segment_type => p_type,

     partition_name => p_partition,

     total_blocks => l_total_blocks,

     total_bytes => l_total_bytes,

     unused_blocks => l_unused_blocks,

     unused_bytes => l_unused_bytes,

     last_used_extent_file_id => l_lastusedextfileid,

     last_used_extent_block_id => l_lastusedextblockid,

     last_used_block => l_last_used_block );

     

     p( 'free blocks', l_free_blks );

     p( 'total blocks', l_total_blocks );

     p( 'total bytes', l_total_bytes );

     p( 'unused blocks', l_unused_blocks );

     p( 'unused bytes', l_unused_bytes );

     p( 'last used ext fileid', l_lastusedextfileid );

     p( 'last used ext blockid', l_lastusedextblockid );

     p( 'last used block', l_last_used_block );

     end;

    過(guò)程已創(chuàng)建。

     

    sql> create table t1(a char(1000)) storage( freelists 3);

    表已創(chuàng)建。

    sql> set serveroutput on;

    sql> exec show_space('t1');

    free blocks.............................0       <==number of blocks on freelist

    total blocks............................5       <==total data blocks in segment

    total bytes.............................20480   <==total bytes in segment

    unused blocks...........................4       <==total unused blocks in segment

    unused bytes............................16384   <==total unused bytes in segment

    last used ext fileid....................15      <==file id of last used extent

    last used ext blockid...................562     <==block id of last used extent

    last used block.........................1       <==last used block in extent

     

    pl/sql 過(guò)程已成功完成。

    有關(guān)show_space的進(jìn)一步使用技巧可參考文獻(xiàn)5。以下利用上面得到的數(shù)據(jù)對(duì)segment header block進(jìn)行dump。

    sql>alter system dump datafile 15 block 562;

    在udump/ora10792.trc中

    *** 2004-09-08 15:29:57.343

    start dump data blocks tsn: 27 file#: 15 minblk 562 maxblk 562

    buffer tsn: 27 rdba: 0x03c00232 (15/562)

    scn: 0x0000.064560e4 seq: 0x02 flg: 0x00 tail: 0x60e41002

    frmt: 0x02 chkval: 0x0000 type: 0x10=data segment header - unlimited

     

      extent control header

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

      extent header:: spare1: 0      space2: 0      #extents: 1      #blocks: 4    

                      last map  0x00000000  #maps: 0      offset: 2080 

          highwater::  0x03c00233  ext#: 0      blk#: 0      ext size: 4    

      #blocks in seg. hdr's freelists: 0    

      #blocks below: 0    

      mapblk  0x00000000  offset: 0    

                       unlocked

         map header:: next  0x00000000  #extents: 1    obj#: 60033  flag: 0x40000000

      extent map

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

       0x03c00233  length: 4    

     

      nfl = 3, nfb = 1 typ = 1 nxf = 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: unused lhd: 0x00000000 ltl: 0x00000000

    end dump data blocks tsn: 27 file#: 15 minblk 562 maxblk 562

       

        對(duì)于上述塊中字段的說(shuō)明,以及相關(guān)試驗(yàn)。由于篇幅所限,本文不再列舉。可參考文獻(xiàn)7。

    對(duì)非segment header的data block的dump方法和上述類似。data block的結(jié)構(gòu)和segment header block不一樣,如果需要了解,可查閱參考文獻(xiàn)和資料。

     
    3.2 提取hwm信息3.2.1 hwm位置
    hwm位置按下面的公式計(jì)算:

        hwm = useed byte = total bytes - unused blocks

    total bytes和unused blocks都可以用show_space提取。

    還可以通過(guò)analyze tables得到hwm信息. dba_tables視圖中包含了可用于各表空間分析的列。其中blocks代表已使用過(guò)的塊即hwm,empty_blocks代表未使用的空間。
    3.2.1 hwm下空間利用信息
    要比較有數(shù)據(jù)行的塊的塊數(shù)和high water mark下總塊數(shù),可以用下面的公式來(lái)展示hwm下未用空間的比例。

     

    p = 1- r/h

    r:有數(shù)據(jù)行的塊的塊數(shù)

    h:hwm下的塊數(shù).

    r可以通過(guò)如下方法獲得:

    oracle7:

    select count(distinct substr(rowid, 15,4) || substr(rowid, 1,8) )  from schema.table;

    oracle8 and oracle9:

    select count(distinct substr(rowid, 7,3) || substr(rowid, 10,6) )  from schema.table;

    如果公式計(jì)算的結(jié)果 p是0,就不需要對(duì)表進(jìn)行重建。如果結(jié)果p大于0,應(yīng)該考慮系統(tǒng)狀況和應(yīng)用需要來(lái)決定是否需要總組表。
    4.優(yōu)化4.1手工回收存儲(chǔ)空間
    在high water mark以上的塊對(duì)性能沒有影響,但是會(huì)耗費(fèi)空間。如何空間大小是一個(gè)考慮的問(wèn)題,就可以決定回收空塊。

    假設(shè)表t1的存儲(chǔ)示意圖如圖2.5所示,使用alter table ... deallocate unused語(yǔ)句可以回收hwm以上的空間。比如:

    alter table t1 deallocate unused;

    回收后t1的存儲(chǔ)示意如圖4.1.1



    圖4.1.1

        如果在alter table ... deallocate unused語(yǔ)句中使用了keep關(guān)鍵字,則可以在hwm之后保留指定大小的空閑空間,比如:

        alter table t1 deallocate unused keep 10k;

    回收后t1的存儲(chǔ)示意如圖4.1.2



    圖4.1.2

     
    4.2刪減表
        根據(jù)3.2.1可以得到hwm以下塊的使用情況。如何p大于時(shí),對(duì)全表掃描性能會(huì)產(chǎn)生影響,同時(shí)也會(huì)耗用空間。

    如果能夠確認(rèn)應(yīng)用有良好的索引幾乎不會(huì)用到全表掃描,那么high water mark以下的空塊,盡管耗費(fèi)了空間,不會(huì)對(duì)訪問(wèn)產(chǎn)生影響。如果不能確定,那么就需要考慮刪減表。

        刪減表的操作將刪除表中所有的記錄,并且重置hwm標(biāo)記。表在刪減之后將成為一個(gè)空表。

        在oracle中刪減表只有如下的兩種辦法:

    1.使用drop語(yǔ)句

        先使用drop語(yǔ)句刪除整個(gè)表,然后再重建這個(gè)表。在刪除-重建的過(guò)程中,與表相關(guān)的所有索引、完整性約束以及觸發(fā)器都會(huì)丟失,并且所有依賴于該表的對(duì)象都會(huì)變?yōu)閕nvalid狀態(tài),同時(shí)原來(lái)爭(zhēng)對(duì)表的授權(quán)也會(huì)失效。因此采用這種方式刪除表中的記錄代價(jià)太大。

     

    2.使用truncate語(yǔ)句

        truncate語(yǔ)句屬于ddl語(yǔ)句,不會(huì)產(chǎn)生任何回退信息,并且被立即自動(dòng)提交。在執(zhí)行truncate語(yǔ)句時(shí)不會(huì)影響到與被刪減表相關(guān)的任何數(shù)據(jù)庫(kù)對(duì)象與授權(quán),也不會(huì)觸發(fā)表中所定義的觸發(fā)器。此外,在對(duì)標(biāo)進(jìn)行刪減時(shí),hwm將重置,已經(jīng)為表分配的存儲(chǔ)空間將被回收。

        在執(zhí)行truncate語(yǔ)句時(shí),可以通過(guò)drop storage子句和reuse storage子句來(lái)控制被釋放的區(qū)是否回收到表空間中。如何作在線系統(tǒng)的truncate,不希望表長(zhǎng)時(shí)間鎖住,那么可以使用reuse storage子句,僅將hwm重置。

     
    4.3 free list優(yōu)化
    free list 競(jìng)爭(zhēng)出現(xiàn)在多個(gè)進(jìn)程使用同一個(gè)free list并試圖同時(shí)修改free list頭部數(shù)據(jù)塊時(shí)。可以通過(guò)查詢視圖v$waitsate的class類型為data block 的記錄來(lái)檢查競(jìng)爭(zhēng)情況。

    產(chǎn)生data block類型競(jìng)爭(zhēng)的主要原因是多個(gè)進(jìn)程試圖同時(shí)修改free list頭部數(shù)據(jù)塊。 然而,它也會(huì)出現(xiàn)在當(dāng)進(jìn)程準(zhǔn)備將塊讀入buffer cathe時(shí),另一個(gè)進(jìn)程需要訪問(wèn)同一個(gè)塊。如果能在v$session_wait中正好捕獲buffer busy waits,就可以通過(guò)查詢v$session_wait中的p3來(lái)判定是那一類。a 0 或 1014代表讀類型,其他的值為修改競(jìng)爭(zhēng)的類型。

       下一步需要確定競(jìng)爭(zhēng)涉及那些段。 如果能夠在v$session_wait捕獲waits,就可以用p1和p2的值 (對(duì)應(yīng)file 和 block) 在dba_extents中找到段名。 如何是一個(gè)表,就很可能需要重建表來(lái)創(chuàng)建更多的process freelists。 一種計(jì)算需要?jiǎng)?chuàng)建多少個(gè)freelist的方法是dump一些段中接近hwm的塊,檢查interested transaction list的個(gè)數(shù),具體方法可參見3.1。interested transactions個(gè)數(shù)的峰值加1 就是需要的最小process freelists的值。

    從2.3和2.4可以看出,使用多個(gè)free list可能導(dǎo)致更多的空塊未被使用, 也可能導(dǎo)致段更快地?cái)U(kuò)展。如果性能是當(dāng)前所關(guān)心的重點(diǎn),那么多free lists 可以用來(lái)提高并發(fā)訪問(wèn)能力,當(dāng)然會(huì)增加一些額外空間的耗用。然而,如果空間使用大小是首先考慮的因素,那么推薦使用single freelist,使參數(shù)freelists=1, 當(dāng)然就不能提升并發(fā)事務(wù)的性能了。

    v$waitstat 也可顯示其他類型class的競(jìng)爭(zhēng),包括segment header 和free list。 出現(xiàn)在同一個(gè)free list group中多個(gè)事務(wù)需要同時(shí)更新它們的free list header記錄時(shí)。 有多種方法來(lái)解決這個(gè)問(wèn)題如重建表采用更多的free list groups,或者增加 _bump_highwater_mark_count大小,或者調(diào)整應(yīng)用本身。

     

    參考文獻(xiàn)和資料:

    1.《freelists and freelist groups. scope & application 》

    2.《initrans, maxtrans, freelists and freelist groups, pctfree and pctused》,mike ault

    3.《freelist internals: an overviewknowledge》,xpert for oracle administration

    4.《blockdump - 8.x data segment header in oracle》

    5.《asktom dbms_space_free_space》,http://asktom.oracle.com

    6.《data blocks and freelists》,http://www.ixora.com.au

    7.《偷窺data block 的物理結(jié)構(gòu)》,http://www.itpub.net

    8.《oracle 9i for windows nt/2000數(shù)據(jù)系統(tǒng)培訓(xùn)教程》,清華大學(xué)出版社

    上述部分文章在我的blog網(wǎng)站http://blog.csdn.net/youbo2004上可找到,對(duì)于研究free list,free list group和block等有很好的幫助。
    發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 宿松县| 乐都县| 巩义市| 崇仁县| 温泉县| 金寨县| 通道| 神池县| 台北县| 津市市| 连州市| 卢湾区| 浏阳市| 博白县| 会泽县| 锡林浩特市| 宜城市| 福安市| 青田县| 苏尼特右旗| 榆社县| 宝兴县| 英山县| 天镇县| 中卫市| 海丰县| 琼海市| 肃北| 望奎县| 连平县| 潜江市| 三穗县| 寻乌县| 靖江市| 微山县| 手游| 饶阳县| 长泰县| 孝义市| 女性| 宜丰县|