在了解rowid前首先需要知道的概念:
在dba_objects中有object_id和data_object_id两列
object_id: 是对每个数据库中数据对象的唯一标识
data_object_id: 用来表示object的物理存储段的实际位置.只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id,而像一些函数,存储过程,以及view等等是没有data_object_id的
一般在数据库中两者是相等的只有在表发生move或truncate时两者才会不等
在dba_data_files中有file_id和relative_fno两列
file_id:可以称为绝对文件编号,即在一个数据库中它是唯一标识一个数据文件
relative_fno:相对文件编号,它在一个表空间中是唯一的,一个表空间最多允许1024个文件,所以在一个数据库中如果数据文件大于1024,则两者就会有不等
ok!!
-----------------------------------解析----------------------------------------
row由18位的64进制数组成,格式为OOOOOO.FFF.BBBBBB.RRR。O代表对象号,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表示长度,53,59,53表示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/