ORACLE update 操作內部原理

發表于:2013-10-11來源:IT博客大學習作者:惜分飛點擊數: 標簽:oracle
對于oracle的update操作,在數據塊中具體是如何出來,是直接更新原來值,還是通過插入新值修改指針的方法實現.下面通過證明:

  對于oracle的update操作,在數據塊中具體是如何出來,是直接更新原來值,還是通過插入新值修改指針的方法實現.下面通過證明:

  模擬表插入數據

  SQL> create table t_xifenfei(id number,name varchar2(10));

  Table created.

  SQL> insert into t_xifenfei values(1,'XFF');

  1 row created.

  SQL> insert into t_xifenfei values(2,'CHF');

  1 row created.

  SQL> commit;

  Commit complete.

  SQL> alter system checkpoint;

  System altered.

  SQL> select id,rowid,

  2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,

  3 dbms_rowid.rowid_block_number(rowid)blockno,

  4 dbms_rowid.rowid_row_number(rowid) rowno

  5 from t_xifenfei;

  ID ROWID REL_FNO BLOCKNO ROWNO

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

  1 AAASc+AAEAAAACvAAA 4 175 0

  2 AAASc+AAEAAAACvAAB 4 175 1

  SQL> alter system dump datafile 4 block 175;

  System altered.

  SQL> select value from v$diag_info where name='Default Trace File';

  VALUE

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

  /u01/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_24625.trc

  數據存儲對應16進制值

  SQL> select dump(1,'16') from dual;

  DUMP(1,'16')

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

  Typ=2 Len=2: c1,2

  SQL> select dump(2,'16') from dual;

  DUMP(2,'16')

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

  Typ=2 Len=2: c1,3

  SQL> select dump('XFF','16') FROM DUAL;

  DUMP('XFF','16')

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

  Typ=96 Len=3: 58,46,46

  SQL> SELECT DUMP('CHF','16') FROM DUAL;

  DUMP('CHF','16')

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

  Typ=96 Len=3: 43,48,46

  得出第一條記錄對應值為:02c10203584646;第二條記錄對應值為:02c10303434846

  dump 數據塊得到記錄

  bdba: 0x010000af

  data_block_dump,data header at 0xb683c064

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

  tsiz: 0x1f98

  hsiz: 0x16

  pbl: 0xb683c064

  76543210

  flag=--------

  ntab=1

  nrow=2

  frre=-1

  fsbo=0x16

  fseo=0x1f84

  avsp=0x1f6e

  tosp=0x1f6e

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

  0x12:pri[0] offs=0x1f8e ---->8078

  0x14:pri[1] offs=0x1f84 ---->8068

  block_row_dump:

  tab 0, row 0, @0x1f8e

  tl: 10 fb: --H-FL-- lb: 0x1 cc: 2

  col 0: [ 2] c1 02

  col 1: [ 3] 58 46 46

  tab 0, row 1, @0x1f84

  tl: 10 fb: --H-FL-- lb: 0x1 cc: 2

  col 0: [ 2] c1 03

  col 1: [ 3] 43 48 46

  end_of_block_dump

  End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175

  bbed查看相關記錄

  BBED> p kdbr

  sb2 kdbr[0] @118 8078 <--第一條row directory指針位置

  sb2 kdbr[1] @120 8068 <--第二條row directory指針位置

  BBED> p *kdbr[0]

  rowdata[10]

  -----------

  ub1 rowdata[10] @8178 0x2c

  BBED> x /rnc

  rowdata[10] @8178

  -----------

  flag@8178: 0x2c (KDRHFL, KDRHFF, KDRHFH)

  lock@8179: 0x01

  cols@8180: 2

  col 0[2] @8181: 1

  col 1[3] @8184: XFF

  BBED> p *kdbr[1]

  rowdata[0]

  ----------

  ub1 rowdata[0] @8168 0x2c

  BBED> x /rnc

  rowdata[0] @8168

  ----------

  flag@8168: 0x2c (KDRHFL, KDRHFF, KDRHFH)

  lock@8169: 0x01

  cols@8170: 2

  col 0[2] @8171: 2

  col 1[3] @8174: CHF

  BBED> d

  File: /u01/oracle/oradata/ora11g/users01.dbf (4)

  Block: 175 Offsets: 8168 to 8191 Dba:0x010000af

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

  2c010202 c1030343 48462c01 0202c102 03584646 010650e5

  <32 bytes per line>

  這里可以得到結論如下:

  1.數據是從塊的底部開始往上存儲

  2.在每一條記錄的頭部分別有flag/lock/cols對應這里的2c0102

  3.這里的偏移量和dump出來的數據可以看出來兩條記錄是連續在一起(偏移量分別為:8168和8178)

  更新一條記錄

  SQL> update t_xifenfei set name='XIFENFEI' where id=1;

  1 row updated.

原文轉自:http://blogread.cn/it/article/5666

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97