rowid详解

在了解rowid前首先需要知道的概念:

dba_objects中有object_iddata_object_id两列

object_id: 是对每个数据库中数据对象的唯一标识
data_object_id: 用来表示object的物理存储段的实际位置.只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id,而像一些函数,存储过程,以及view等等是没有data_object_id

一般在数据库中两者是相等的只有在表发生movetruncate时两者才会不等

 

dba_data_files中有file_idrelative_fno两列

file_id:可以称为绝对文件编号,即在一个数据库中它是唯一标识一个数据文件

relative_fno:相对文件编号它在一个表空间中是唯一的,一个表空间最多允许1024个文件,所以在一个数据库中如果数据文件大于1024,则两者就会有不等

 

ok!!

-----------------------------------解析----------------------------------------

row由18位的64进制数组成,格式为OOOOOO.FFF.BBBBBB.RRRO代表对象号,F代表文件号,B代表块号,R代表行号。转换为2进制就是:32bit obj# + 10bit rfile# + 22bit block# + 16bit ROW#

所以通过rowid我们可知:

1.     每个表空间最大的文件数量为210=1024去掉全0和全1,通常为1022

2.     每个数据文件块数量为222=4M

3.     每个块中的行数216=65536,通常每个块中最多容纳65536条记录

A~Z:0-25   a~z:26-51   0~9:52-61   +:62    /:63

SQL> select rowid from test where rownum<2;

 

ROWID

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

AAAEdMAAEAAAADLAAA

 

可以将rowid分为如下几部分:

 

AAAEdM:代表着data_object_id,即表示对象test在数据库中的实际物理存储位置

AAE:代表RELATIVE_FNO,即表示属于哪个数据文件

AAAADL:代表在数据文件中的哪个块

AAA:代表在块中的哪一行

 

 

SQL> select object_id,data_object_id from dba_objects where object_name='TEST';

 

 OBJECT_ID DATA_OBJECT_ID

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

     18252       18252

SQL> select 4*power(64,2)+29*64+12 from dual;

 

4*POWER(64,2)+29*64+12

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

         18252

AAE=4

AAAADL=203

AAA=0

 

所以test表的第一行数据存储在4号数据文件的203号块的第一行


 

test表的数据较多所以只记录了第一行的前两列

SQL> select owner,object_name from test where rownum<2;

 

OWNER          OBJECT_NAME

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

SYS               WRH$_SQLSTAT

 

可以dump出文件查看具体是否准确:alter system dump datafile 4 block 203;

查看trace文件,省略部分信息

.

.

Start dump data blocks tsn: 4 file#:4 minblk 203 maxblk 203

Block dump from cache:

Dump of buffer cache at level 4 for tsn=4, rdba=16777419

BH (0x66fe2528) file#: 4 rdba: 0x010000cb (4/203) class: 1 ba: 0x66d18000

  set: 6 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 504,28

  dbwrid: 0 obj: 18252 objn: 18252 tsn: 4 afn: 4 hint: f

  hash: [0x63fddd68,0x71591340] lru: [0x66fe2740,0x66fe24e0]

  ckptq: [NULL] fileq: [NULL] objq: [0x68434900,0x66fe2508]

  st: XCURRENT md: NULL tch: 3

  flags: only_sequential_access

  LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]

  cr pin refcnt: 0 sh pin refcnt: 0

Block dump from disk:

.

.

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0xffff.000.00000000  0x00000000.0000.00 C---    0  scn 0x0000.000dcb3f

0x02   0x0007.010.000001ba  0x00c01189.006b.08  C---    0  scn 0x0000.000dcde7

0x03   0x0001.019.000001bf  0x00c0095d.0064.0f C---    0  scn 0x0000.000dce16

bdba: 0x010000cb

data_block_dump,data header at 0x2b086117aa7c

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

tsiz: 0x1f80

hsiz: 0x80

pbl: 0x2b086117aa7c

     76543210

flag=--------

ntab=1

nrow=55    ------共55

frre=-1

fsbo=0x80

fseo=0x3ac

avsp=0x32c

tosp=0x32c

.

.

block_row_dump:

tab 0, row 0, @0x1f04

tl: 124 fb: --H-FL-- lb: 0x0  cc: 14

col  0: [ 3]  53 59 53

col  1: [12]  57 52 48 245f53 514c53 54 41 54

col  2: [26]

 57 52 48 245f53 514c53 54 415f33 38 38 39 38 34 36 34 33 385f31 31

 30

col  3: [ 4]  c3 02 52 3d

col  4: [ 4]  c3 02 52 3d

col  5: [15]  54 41 424c45 20 50 41 52 54 49 54 494f4e

col  6: [ 7]  78 71 09 0e 10 0d 17

col  7: [ 7]  78 71 09 0e 10 0d 17

col  8: [19]  32 30 31 33 2d 30 39 2d 31 343a31 353a31 323a32 32

col  9: [ 5]  56 414c49 44

col 10: [ 1]  4e

col 11: [ 1]  4e

col 12: [ 1]  4e

col 13: [ 2]  c1 02

tab 0, row 1, @0x1e82

tl: 130 fb: --H-FL-- lb: 0x0  cc: 14

 

上述信息显示第一行的具体值

col  0: [ 3]  53 59 53   --------表示第一行第一列存储的具体值

 

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

 

DUMP('SYS',16)

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

Typ=96 Len=3: 53,59,53  -----typ表示数据类型,len表示长度,535953表示SYS在数据库中的具体存储与trace文件一致

 

 

col  1: [12]  57 52 48 245f53 514c53 54 41 54 ----------表示第一行第二列

 

SQL> select dump('WRH$_SQLSTAT',16) from dual;

 

DUMP('WRH$_SQLSTAT',16)

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

Typ=96 Len=12: 57,52,48,24,5f,53,51,4c,53,54,41,54

 

通过dump函数我们可以看出‘SYS’和'WRH$_SQLSTAT‘在数据库中确实是按上面的方法存储的。

 

也可以顺序查看

col  0: [ 3]  53 59 53 --------为16进制

53转换为10进制为83

ascii码83所对应的字符为S

SQL> select chr(83) from dual;

 

CHR(83

------

S


所以通过rowid我们就可以知道此条数据在物理位置的具体信息,以及数值

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29014732/viewspace-772798/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29014732/viewspace-772798/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值