如何获取数据块结构信息dump

有个pub_department的表,索引为PK_PUB_DEPARTMENT。

1.找到object_id

select   object_id from dba_objects s  where   s.object_name='PK_PUB_DEPARTMENT';

 OBJECT_ID

----------

64408

2.进行转储

alter   session  set  events  'immediate trace name treedump level 64408';

----- begin tree dump

branch: 0x201262433629732 (0: nrow:2,level:1)

   leaf: 0x2012626 33629734 (-1: nrow: 292 rrow:292)

   leaf: 0x2012627 33629735 (0: nrow: 311 rrow:311)

----- end tree dump

select dbms_utility.data_block_address_file(33629735) "file",

       dbms_utility.data_block_address_block(33629735) "block"

  from dual;

      file     block

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

         8     75303

 alter system dump datafile block 75303;

。。。。。。。。。。。。省略部分内容。。。。。。。。。。。。

 row#310[7921] flag:------, lock: 0, len=11, data:(6): 02 06 d6 25 00 0d

 col 0; len 2; (2): c35b

可以看到索引的内部结构为值(c35b为900000)+rowid(0206d625000d此处只是文件号+块号+行数)

select utl_raw.cast_to_number('c35b')  from dual;

UTL_RAW.CAST_TO_NUMBER('C35B')

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

                        900000

 3.对rowid的解析

 select   rowid,dbms_rowid.rowid_object(rowid) object_id,--(AAAMim)AAFAAAAAMAAC数据对象号

     dbms_rowid.rowid_relative_fno(rowid) file_id,-- AAAMim(AAF)AAAAAMAAC 相对文件号

     dbms_rowid.rowid_block_number(rowid) block_id,-- AAAMimAAF(AAAAAM)AAC 在第几个块

     dbms_rowid.rowid_row_number(rowid) num -- AAAMimAAFAAAAAM(AAC)在block中的行数

     from pub_departmentwhere department_id =900000;    

ROWID              OBJECT_ID    FILE_ID   BLOCK_ID        NUM

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

AAAPuXAAIAABtYlAAN     64407         8    448037        13

 

 select rowid,dump(rowid,16)  dump_rowid    from pub_department  where department_id=900000;

ROWID               DUMP_ROWID

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

AAAPuXAAIAABtYlAAN   Typ=69 Len=10:0,0,fb,97,2,6,d6,25,0,d

  SELECT pkg_number_trans.f_hex_to_dec('fb97'FROM dual;--64407 ojbect_id

 --第5、6为的值除以64得到的商是相对文件号,余数是BLOCK号的高位,

乘以65536后加上低两位才是BLOCK号。

包pkg_number_trans来自于http://blog.csdn.net/guogang83/article/details/8002014

  SELECT pkg_number_trans.f_hex_to_dec('0206')  FROM dual;

  select  518/64   from dual;  --8  文件号

  select   mod(518,64)   from dual-    -6余数为block的高位

  SELECT pkg_number_trans.f_hex_to_dec('06d625')   FROM   dual;--448037  块号

  SELECT pkg_number_trans.f_hex_to_dec('0d')  FROM   dual;--13  行号

原文地址:https://www.cnblogs.com/HondaHsu/p/3532513.html