总觉得时间不够用,原来是自己把时间分散了。

append 与 Highwater 测试(1)

上一篇 / 下一篇  2008-05-30 13:39:53 / 个人分类:Oracle Management

 创建测试表:

 

SQL> create table test_block as select * from dba_objects where 1 = 0;

 

表已创建。

 

SQL> select OWNER, SEGMENT_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS, FREELISTS
.xOs H9F'J{0F$V0  2    from dba_segments
2z:Jp+p Sw$BW0  3   where segment_name = 'TEST_BLOCK';

 

SEGMENT_NAME  HEADER_FILEHEADER_BLOCK  BLOCKS   EXTENTS
#b vSV&ko0------------- ----------- ------------ ------- ---------ITPUB个人空间#Y:ZF/|C0bL
TEST_BLOCK             11         193       8         1

 

 

SQL> select EXTENT_ID, FILE_ID, BLOCK_ID, BYTES, BLOCKS, RELATIVE_FNOITPUB个人空间6[2Q;pY6YJ-c8G
  2    from dba_extents
Vt1C2qB%zT0  3   where segment_name = 'TEST_BLOCK';

 

 EXTENT_ID    FILE_ID  BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
u{M-q AVn0---------- ---------- ---------- ---------- ---------- ------------ITPUB个人空间F ?Q6A&?*J
         0         11       193      65536          8           11

 

SQL> insert into test_block select * from dba_objects where rownum < 12;

 

已创建11行。

 

SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,
4p`'Y YFe0  2         dbms_rowid.rowid_block_number(rowid) block#ITPUB个人空间:[_4G6xTe
  3    from test_block;

 

     FILE#     BLOCK#
'j(P_u X(q#h9PwPg0---------- ----------
sh;zH}?u%e\0        11       194
xp| Rf Z t;B sl T0        11        194
P iBL8N*vBWn4x0        11        194ITPUB个人空间8O m}O Ld Wv;P
        11        194ITPUB个人空间nyC,A4a.z^
        11        194
NYB;D8dd0        11        194
2[9pjkwMe \;u0        11        194
A G HobMp0        11        194ITPUB个人空间N']%u}J!h
        11        194ITPUB个人空间qx)K!HX!`5^)]0`
        11        194

        11        194

 

已选择11行。

 

 

数据插入到了第194块。那么,被称为 HEADER_BLOCK 的第193块是做什么的呢?
 

SQL> alter system dump datafile 11 block 193;

 

系统已更改。

 

SQL> select p.value||'\'||i.instance_name||'_ora_'||p.spid||'.trc' trace_pathITPUB个人空间rq }+]4s_B
  2  from v$process p, v$instance i, v$parameter pITPUB个人空间6w9^1lU#B7p1zI}
  3  where p.addr = (
}H `0j1U1P#s@0  4  select paddr from v$session
5B[8?E9Y @0  5  where sid = ( select sid from v$mystat where rownum = 1)
.i N&@j(@0w%K0  6  )ITPUB个人空间$uy2j"muPfbY
  7  and p.name='user_dump_dest';

 

TRACE_PATH
g(Pl:E ~ s0-------------------------------------------------------------------ITPUB个人空间]4h Fc]8}U-Dq
D:\oracle\admin\ora\udump\orasid_ora_3376.trc

 

 

我们看看193块中的信息:
 

*** 2008-05-30 11:24:07.000ITPUB个人空间0qDP R)Y3q'^
Start dump data blocks tsn: 11 file#: 11 minblk 193 maxblk 193ITPUB个人空间Z*f5k9r|
buffer tsn: 11 rdba: 0x02c000c1 (11/193)
6ZOX2u)Bsb&r3c'k0scn: 0x0000.1bf3af2f seq: 0x01 flg: 0x00 tail: 0xaf2f1001ITPUB个人空间/n;|1E.Ey_3K:EeC
frmt: 0x02 chkval: 0x0000type: 0x10=DATA SEGMENT HEADER - UNLIMITEDITPUB个人空间 OD a0I_i6t9u(Z
  Extent Control Header
cB4QX8C'D3U4p^0  -----------------------------------------------------------------ITPUB个人空间}"Yr-wzO-]*l"h
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 7    
a4W Yb&ht0                  last map  0x00000000  #maps: 0      offset: 4128 ITPUB个人空间r-O"a,n9J'J`2R6Ot
     Highwater::  0x02c000c3  ext#: 0      blk#: 1      ext size: 7    ITPUB个人空间[8ML+KdL
  #blocks in seg. hdr's freelists: 1    ITPUB个人空间 SS)MP-]
  #blocks below: 1    ITPUB个人空间3Ha*il"K)XM9V$N
  mapblk  0x00000000  offset: 0    
ji[3_ M v*}?'GQ0                   UnlockedITPUB个人空间Y,} e&@tV0f |+FM7w
     Map Header:: next  0x00000000  #extents: 1    obj#: 31997  flag: 0x40000000
\&o'`(_+h'v&f0  Extent MapITPUB个人空间 ZCt0V:ru+E
  -----------------------------------------------------------------
N&s.p$x"s8`0   0x02c000c2  length: 7    ITPUB个人空间e"zYSw2\kb
 ITPUB个人空间o4`(I0qW9Os
  nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1ITPUB个人空间;e eC}m^
  SEG LST:: flg: USED   lhd: 0x02c000c2 ltl: 0x02c000c2ITPUB个人空间w(r`sf|7`
End dump data blocks tsn: 11 file#: 11 minblk 193 maxblk 193

 

从 type 中,可以看到第一个块是数据段的头信息。我们看一下这里的高水位标识(Highwater):
 

SQL> select to_number('c3', 'xxxxxxxxxx') Highwater
H"eMttu%]0  2    from dual;

 

 HIGHWATERITPUB个人空间6P)to dUK
----------
j&k!Z `7F%Y2wc _0       195

 
现在高水位是在195块,我再插入一条数据看看:

 

SQL> insert into test_block select * from dba_objects where rownum = 1;

 

已创建1行。

 

SQL> select dbms_rowid.rowid_block_number(rowid) block# from test_block;

 

   BLOCK#

----------

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

 

已选择12行。

 

SQL> rollback;

 

回退已完成。

 

SQL> insert/*+ append */ into test_block select * from dba_objects where rownum = 1;

 

已创建1行。

 

SQL> select dbms_rowid.rowid_block_number(rowid) block# from test_block;

select dbms_rowid.rowid_block_number(rowid) block# from test_block

                                                       *

ERROR位于第1:

ORA-12838:无法在并行模式下修改之后读/修改对象

 

SQL> alter system dump datafile 11 block 193;

 

系统已更改。

 

此时193块信息如下: 

 

*** 2008-05-30 11:48:21.000

*** SESSION ID:(11.7) 2008-05-30 11:48:21.000

Start dump data blocks tsn: 11 file#: 11 minblk 193 maxblk 193

buffer tsn: 11 rdba: 0x02c000c1 (11/193)

scn: 0x0000.1bf3af2f seq: 0x01 flg: 0x04 tail: 0xaf2f1001

frmt: 0x02 chkval: 0x2339 type: 0x10=DATA SEGMENT HEADER - UNLIMITED

 Extent Control Header

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

 Extent Header:: spare1: 0     spare2: 0     #extents: 1     #blocks: 7    

                 last map 0x00000000 #maps: 0     offset: 4128 

     Highwater:: 0x02c000c3 ext#: 0     blk#: 1     ext size: 7    

 #blocks in seg. hdr's freelists: 1    

 #blocks below: 1    

 mapblk 0x00000000 offset: 0    

                  Unlocked

    Map Header:: next 0x00000000 #extents: 1   obj#: 31997 flag: 0x40000000

 Extent Map

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

  0x02c000c2 length: 7    

 

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

 SEG LST:: flg: USED  lhd: 0x02c000c2 ltl: 0x02c000c2

End dump data blocks tsn: 11 file#: 11 minblk 193 maxblk 193

 

append 一条数据后,在提交前高水位并没有发生变化,但此时所插入的数据已经保存在第195块了。此时第195块信息如下:

 

*** 2008-05-30 11:55:44.000

Start dump data blocks tsn: 11 file#: 11 minblk 195 maxblk 195

buffer tsn: 11 rdba: 0x02c000c3 (11/195)

scn: 0x0000.1bf3c156 seq: 0x02 flg: 0x04 tail: 0xc1560602

frmt: 0x02 chkval: 0x3364 type: 0x06=trans data

Block header dump: 0x02c000c3

 Object id on Block? Y

 seg/obj: 0x7cfd csc: 0x00.1bf3c155 itc: 3 flg: - typ: 1 - DATA

    fsl: 0 fnx: 0x0 ver: 0x01

 

 Itl          Xid                 Uba        Flag Lck       Scn/Fsc

0x01  0x0009.025.00005240 0x00000000.0000.00 ----   0 fsc 0x0000.00000000

0x02  0x0000.000.00000000 0x00000000.0000.00 ----   0 fsc 0x0000.00000000

0x03  0x0000.000.00000000 0x00000000.0000.00 ----   0 fsc 0x0000.00000000

 

data_block_dump,data header at 0x3051074

===============

tsiz: 0x1f88

hsiz: 0x14

pbl: 0x03051074

bdba: 0x02c000c3

    76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f28

avsp=0x1f14

tosp=0x1f14

0xe:pti[0]nrow=1  offs=0

0x12:pri[0]    offs=0x1f28

block_row_dump:

tab 0, row 0, @0x1f28

tl: 96 fb: --H-FL-- lb: 0x0 cc: 13

col 0: [ 3] 53 59 53

col 1: [22]

 2f 31 30 30 35 62 64 33 30 5f 4c 6e 6b 64 43 6f 6e 73 74 61 6e 74

col 2: *NULL*

col 3: [ 4] c3 02 49 57

col 4: *NULL*

col 5: [10] 4a 41 56 41 20 43 4c 41 53 53

col 6: [ 7] 78 6b 08 1f 18 28 1d

col 7: [ 7] 78 6b 08 1f 18 28 1d

col 8: [19] 32 30 30 37 2d 30 38 2d 33 31 3a 32 33 3a 33 39 3a 32 38

col 9: [ 5] 56 41 4c 49 44

col 10: [ 1] 4e

col 11: [ 1] 4e

col 12: [ 1] 4e

end_of_block_dump

End dump data blocks tsn: 11 file#: 11 minblk 195 maxblk 195

 

 我们继续刚才的操作,提交数据,看此时数据在数据块中的分布:

 

SQL> commit;

 

提交完成。

 

SQL> select dbms_rowid.rowid_block_number(rowid) block# from test_block;

 

   BLOCK#

----------

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

      195

 

已选择12行。

 
看看此时的高水位:

 

SQL> alter system dump datafile 11 block 193;

 

系统已更改。

 

193块的内容如下:

 

*** 2008-05-30 13:13:54.000

Start dump data blocks tsn: 11 file#: 11 minblk 193 maxblk 193

buffer tsn: 11 rdba: 0x02c000c1 (11/193)

scn: 0x0000.1bf3c7bf seq: 0x01 flg: 0x04 tail: 0xc7bf1001

frmt: 0x02 chkval: 0x233e type: 0x10=DATA SEGMENT HEADER - UNLIMITED

 Extent Control Header

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

 Extent Header:: spare1: 0     spare2: 0     #extents: 1     #blocks: 7    

                 last map 0x00000000 #maps: 0     offset: 4128 

     Highwater:: 0x02c000c4 ext#: 0     blk#: 2     ext size: 7    

 #blocks in seg. hdr's freelists: 1    

 #blocks below: 2    

 mapblk 0x00000000 offset: 0    

                  Unlocked

    Map Header:: next 0x00000000 #extents: 1   obj#: 31997 flag: 0x40000000

 Extent Map

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

  0x02c000c2 length: 7    

 

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

 SEG LST:: flg: USED  lhd: 0x02c000c2 ltl: 0x02c000c2

End dump data blocks tsn: 11 file#: 11 minblk 193 maxblk 193

  

 

SQL> select to_number('c4', 'xxx') from dual;

 

TO_NUMBER('C4','XXX')

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

                 196

 

提交后,高水位移动到了第196块。

 

 

使用直接路径插入时,会将数据插入到高水位以上的数据块中,不会扫描 freelist 中的空闲块。此时我再正常插入一条数据呢?应该插入到 194 块,因为此时 194 块还没有装满。测试一下:

 

SQL> insert into test_block select * from dba_objects where rownum = 1;

 

已创建1行。

 

SQL> select dbms_rowid.rowid_block_number(rowid) block# from test_block;

 

   BLOCK#

----------

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

      194

   

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 423
  • 日志数: 1032
  • 书签数: 1
  • 建立时间: 2007-12-08
  • 更新时间: 2008-05-30

RSS订阅