ITPUB??ì3
2010数据库技术大会
ITPUB论坛 » Oracle数据库管理 » insert时堆表数据块写入顺序的问题


您有 1 条公共消息
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...

    标题: insert时堆表数据块写入顺序的问题
    离线 adian
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 848 (2716)
    社区积分 3 (25037)
    注册日期 2004-7-24
    论坛徽章:3
    2009新春纪念徽章2008新春纪念徽章ITPUB新首页上线纪念徽章   
          

    发表于 2007-6-30 03:03 
    insert时堆表数据块写入顺序的问题

    TOM说,对于堆表数据的插入,数据会被写到最适合的块,而不是以特定的顺序写入。

    如下的实验中,测试数据库的块大小为8k,建立一张表,插入3行数据。 第一行大约0.2k,第二行大约8k,第三行大约0.2k。 根据上面的结论,第一行在一个块(快号10)上,第二行由于太大不能在第一个块上放下( 8k + 0.2k > 8k ),将会在第二个块(快号11)写入。 第三行根据上述理论应该写入第一个块( 0.2k + 0.2k < 8k )。 为什么会写入第三个块(快号12)了呢,百思不得其解,谢谢指点
    PHP code:


    SQL
    show parameters db_block_size;



    NAME                                 TYPE        VALUE

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

    db_block_size                        integer     8192

    SQL
    create table t i number,  a varchar2(4000),  b varchar2(4000) );



    Table created.



    SQLinsert into t values 1rpad('*',100,'*'), rpad('*',100,'*')  );



    1 row created.



    SQLinsert into t values 2rpad('*',3900,'1'), rpad('*',3900,'1') );



    1 row created.



    SQLinsert into t values 3rpad('*',100,'2') , rpad('*',100,'2') );



    1 row created.



    SQL>

    SQLcommit;



    Commit complete.



    SQLSELECT ROWIDiDBMS_ROWID.rowid_object (ROWIDOBJECT,

      
    2         DBMS_ROWID.rowid_relative_fno (ROWIDfile_no,

      
    3         DBMS_ROWID.rowid_block_number (ROWIDBLOCK,

      
    4         DBMS_ROWID.rowid_row_number (ROWIDrowno

      5    FROM t
    ;



    ROWID                       I     OBJECT    FILE_NO      BLOCK      ROWNO

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

    AAAHjeAAMAAAAAKAAA          1      30942         12         10          0

    AAAHjeAAMAAAAALAAA          2      30942         12         11          0

    AAAHjeAAMAAAAAMAAA          3      30942         12        12       &nb




    __________________
    只看该作者    顶部
    离线 stronghearted
    beginner


    精华贴数 0
    个人空间 0
    技术积分 3149 (582)
    社区积分 135 (3653)
    注册日期 2007-4-19
    论坛徽章:10
    会员2007贡献徽章授权会员2009日食纪念生肖徽章2007版:蛇2008北京奥运纪念徽章:现代五项生肖徽章2007版:羊
    2008新春纪念徽章生肖徽章2007版:鸡生肖徽章2007版:鼠ITPUB新首页上线纪念徽章  

    发表于 2007-6-30 08:00 
    学习,希望大师们解答!


    __________________
    我的茅庐

    佛曰:
    让我们成熟的,是经历,是磨难;
    让我们幸福的,是宽容,是爱;
    让我们心安的,是理解,是信任。
    只看该作者    顶部
    离线 biti_rainy
    人生就是如此



    精华贴数 39
    个人空间 0
    技术积分 112692 (4)
    社区积分 12111 (165)
    注册日期 2001-12-12
    论坛徽章:55
    现任管理团队成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京2009年会纪念徽章ITPUB北京九华山庄2008年会纪念徽章
    管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

    发表于 2007-6-30 08:55 
    1:不知道你是不是ASSM 类型的表空间
    2:如果不是assm类型表空间,存在这种可能,当block 10 不能被插入一个新的数据的时候将从 freelist中摘掉。 这么大的行我没有测试过,以前我测试过比如block 快达到 (1 -  pctfree) 的时候如果新行不能被插入的时候就从freelist移掉了。


    __________________
    只看该作者    顶部
    离线 adian
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 848 (2716)
    社区积分 3 (25037)
    注册日期 2004-7-24
    论坛徽章:3
    2009新春纪念徽章2008新春纪念徽章ITPUB新首页上线纪念徽章   
          

    发表于 2007-6-30 10:50 
    我的不是assm,表空间为SEGMENT SPACE MANAGEMENT MANUAL

    那就是当oracle发现第二行不能插入block10的时候,就将blcok10从freelist移掉了。

    但是block还有挺大空余空间,这样的话,有点浪费

    有什么方法察看这个对象的相关的freelist,然后再看freelist有哪些block呢,谢谢!


    大师周末早起替人解惑啊,谢谢:)


    __________________
    只看该作者    顶部
    离线 chen__han1
    桔~


    精华贴数 0
    个人空间 0
    技术积分 1492 (1418)
    社区积分 11 (12747)
    注册日期 2007-3-9
    论坛徽章:4
    生肖徽章2007版:牛生肖徽章2007版:兔数据库板块每日发贴之星ITPUB新首页上线纪念徽章  
          

    发表于 2007-7-1 02:42 
    是啊,有这个方法吗,我也想知道


    __________________
    天气好热...
    只看该作者    顶部
    离线 biti_rainy
    人生就是如此



    精华贴数 39
    个人空间 0
    技术积分 112692 (4)
    社区积分 12111 (165)
    注册日期 2001-12-12
    论坛徽章:55
    现任管理团队成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京2009年会纪念徽章ITPUB北京九华山庄2008年会纪念徽章
    管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

    发表于 2007-7-1 08:43 
    要看的话,你必须得熟悉 block 的结构中关于 freelist 的 link 这部分内容,通过对segment head进行 block  dump 就可以找到link  headr 然后顺着一个个block的找就看到了。

    你也可以搜索下有关freelist的文章,有介绍这些内容的。


    __________________
    只看该作者    顶部
    离线 adian
    中级会员


    精华贴数 1
    个人空间 0
    技术积分 848 (2716)
    社区积分 3 (25037)
    注册日期 2004-7-24
    论坛徽章:3
    2009新春纪念徽章2008新春纪念徽章ITPUB新首页上线纪念徽章   
          

    发表于 2007-7-1 14:07 
    网上看了一些资料,重新作了一下测试,不知道测试过程或者对freelist的理解有什么问题没有.....
    PHP code:


    SQL
    create table t i number,  a varchar2(4000),  b varchar2(4000) );



    Table created.



    SQLselect FILE_IDblock_idblocks from dba_extents where segment_name 'T'

    AND OWNER 'SCOTT';



       
    FILE_ID   BLOCK_ID     BLOCKS

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

            
    12          9          8



    SQL
    alter system dump datafile 12 block 9;--dump segment header



    System altered
    .



      
    nfl 1nfb 1 typ 1 nxf 0 ccnt 0

      SEG LST
    :: flgUNUSED lhd0x00000000 ltl0x00000000 

    End dump data blocks tsn
    13 file#: 12 minblk 9 maxblk 9

    -- 根据nfl的值得知,有一个freelist,根据flag的值得知,这个freelist尚未使用





    SQL
    insert into t values 1rpad('*',100,'*'), rpad('*',100,'*')  );



    1 row created.



    SQLSELECT ROWIDiDBMS_ROWID.rowid_object (ROWIDOBJECT,

      
    2     DBMS_ROWID.rowid_relative_fno (ROWIDfile_no,

      
    3       DBMS_ROWID.rowid_block_number (ROWIDBLOCK,

      
    4     DBMS_ROWID.rowid_row_number (ROWIDrowno

      5   FROM t
    ;



    ROWID                       I     OBJECT    FILE_NO      BLOCK      ROWNO

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

    AAAHkEAAMAAAAAKAAA          1      30980         12         10          0





    SQL
    alter system dump datafile 12 block 10;--插入数据位于第10块,dump出来



    System altered
    .



    Block header dump:  0x0300000a

     Object id on Block
    Y

     seg
    /obj0x7904  csc0x00.55c15a  itc2  flgO  typDATA

         fsl
    0  fnx0x0 ver0x01

    --根据flag的值得知,这个块在freelist上



    SQL
    alter system dump datafile 12 block 9;



    System altered.



    alter system dump datafile 12 block 9;

    nfl 1nfb 1 typ 1 nxf 0 ccnt 1

      SEG LST
    :: flgUSED   lhd0x0300000a ltl0x0300000a 

    End dump data blocks tsn
    13 file#: 12 minblk 9 maxblk 9

    --顺便看一下block9flg标示已经变为USED, lhd的值指向block 10的



    SQL
    insert into t values 2rpad('*',3900,'1'), rpad('*',3900,'1') );



    1 row created.



    SQLSQLSELECT ROWID

    SP2
    -0734unknown command beginning &quot;SQLSELEC...&quot; - rest of line ignored.

    SQL>   2     DBMS_ROWI

    SQL
    SELECT ROWIDiDBMS_ROWID.rowid_object (ROWIDOBJECT,

      
    2     DBMS_ROWID.rowid_relative_fno (ROWIDfile_no,

      
    3       DBMS_ROWID.rowid_block_number (ROWIDBLOCK,

      
    4     DBMS_ROWID.rowid_row_number (ROWIDrowno

      5   FROM t
    ;



    ROWID                       I     OBJECT    FILE_NO      BLOCK      ROWNO

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

    AAAHkEAAMAAAAAKAAA          1      30980         12         10          0

    AAAHkEAAMAAAAALAAA          2      30980         12         11          0



    SQL
    alter system dump datafile 12 block 10;



    System altered.



    alter system dump datafile 12 block 10;

    Block header dump:  0x0300000a

     Object id on Block
    Y

     seg
    /obj0x7904  csc0x00.55c15a  itc2  flg: -  typDATA

         fsl
    0  fnx0x0 ver0x01

    --flg的值为&quot;-&quot;,表示当插入第二行的时候,block10已经从freelist中移掉。 为什么???block10有超过 8k*pctfree的空间啊?



    SQL
    alter system dump datafile 12 block 11;



    System altered.



    Block header dump:  0x0300000b

     Object id on Block
    Y

     seg
    /obj0x7904  csc0x00.55c5b5  itc2  flgO  typDATA

         fsl
    0  fnx0x0 ver0x01

    --block11这个时候

    结论:如biti_rainy所言,如果不是assm类型表空间,存在这种可能block 10 不能被插入一个新的数据的时候将从 freelist中摘掉了。

    问题: oracle根据什么算法,将block10丛freelist移除? 不应该啊,因为block10有超过 8k*pctfree的空间啊?


    __________________
    只看该作者    顶部
     
        

    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们