五.......ROWID的计算方法。
--64进制的数据
--实例
SQL> select rowid,id,name from t1;
ROWID ID NAME
------------------ ---------- --------------------
AAAMjiAAFAAAAAMAAA 1 a
AAAMjiAAFAAAAAMAAB 2 b
--A~Z 0~25
--a~z 26~51
--0~9 52~61
--+ 62
--/ 63
--AAAMji AAF AAAAAM AAA
前六位是该数据的段编号
AAAMji分别对应 0,0,0,12,35,34
SQL>select 12*64*64 + 35*64 + 34 as rowidvalue from dual --结果可以得到是 51426
--查询该表的ID,也就是段ID(表和索引是段,有data_object_id的值),能得到一个数值(data_object_id的值)。这个
--数值和ROWID的前六位是相同的
SQL>select object_id ,data_object_id,object_name from dba_objects where object_name = 'T1'
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- ------------
51426 51426 T1
AAF 代表 该数据所属于的数据文件编号;这里的值是5,即可以查出来文件名
SQL> select file_name from dba_data_files where file_id=5;
FILE_NAME
--------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\OMF\ORCL\DATAFILE\O1_MF_XXX_76LB8FNJ_.DBF
AAAAAM 代表该行数据所属的第几个数据块。oralce默认每块8K字节。此数据在第12个数据块上。
AAA 代表该行数据是这个块上的第几条数据。这里可以看到,是第1条,序列号为0、
由上面的分析可以知道,第一个ROWID,是5号文件,块ID为12,这里的0号数据。
--从内存中选择该行所在对象在内存中的块编号的信息,,
-- 注意,这里是内存中的信息,重新启动后,不访问,则没有数据,因为使用的是data buffer。。
SQL> select FILE#,BLOCK#,OBJD from v$bh where bjd =51426;
FILE# BLOCK# OBJD
---------- ---------- ----------
5 16 51426
5 11 51426
5 14 51426
5 9 51426
5 12 51426
5 15 51426
5 10 51426
5 13 51426
可以看到该对象从 9开始,到16,一共占了8个块,这里是与以下查询吻合的。
SQL>select SEGMENT_NAME,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where segment_name = 'T1'
SEGMENT_NAME FILE_ID BLOCK_ID BLOCKS
------------ ---------- ---------- ----------
T1 5 9 8
这时候,重新启动数据库之后,如果不使用slect * from t1,则v$bh中无此数据的块信息,除非访问过一次。
访问过,就留在databuffer中了。
--64进制的数据
--实例
SQL> select rowid,id,name from t1;
ROWID ID NAME
------------------ ---------- --------------------
AAAMjiAAFAAAAAMAAA 1 a
AAAMjiAAFAAAAAMAAB 2 b
--A~Z 0~25
--a~z 26~51
--0~9 52~61
--+ 62
--/ 63
--AAAMji AAF AAAAAM AAA
前六位是该数据的段编号
AAAMji分别对应 0,0,0,12,35,34
SQL>select 12*64*64 + 35*64 + 34 as rowidvalue from dual --结果可以得到是 51426
--查询该表的ID,也就是段ID(表和索引是段,有data_object_id的值),能得到一个数值(data_object_id的值)。这个
--数值和ROWID的前六位是相同的
SQL>select object_id ,data_object_id,object_name from dba_objects where object_name = 'T1'
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- ------------
51426 51426 T1
AAF 代表 该数据所属于的数据文件编号;这里的值是5,即可以查出来文件名
SQL> select file_name from dba_data_files where file_id=5;
FILE_NAME
--------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\OMF\ORCL\DATAFILE\O1_MF_XXX_76LB8FNJ_.DBF
AAAAAM 代表该行数据所属的第几个数据块。oralce默认每块8K字节。此数据在第12个数据块上。
AAA 代表该行数据是这个块上的第几条数据。这里可以看到,是第1条,序列号为0、
由上面的分析可以知道,第一个ROWID,是5号文件,块ID为12,这里的0号数据。
--从内存中选择该行所在对象在内存中的块编号的信息,,
-- 注意,这里是内存中的信息,重新启动后,不访问,则没有数据,因为使用的是data buffer。。
SQL> select FILE#,BLOCK#,OBJD from v$bh where bjd =51426;
FILE# BLOCK# OBJD
---------- ---------- ----------
5 16 51426
5 11 51426
5 14 51426
5 9 51426
5 12 51426
5 15 51426
5 10 51426
5 13 51426
可以看到该对象从 9开始,到16,一共占了8个块,这里是与以下查询吻合的。
SQL>select SEGMENT_NAME,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where segment_name = 'T1'
SEGMENT_NAME FILE_ID BLOCK_ID BLOCKS
------------ ---------- ---------- ----------
T1 5 9 8
这时候,重新启动数据库之后,如果不使用slect * from t1,则v$bh中无此数据的块信息,除非访问过一次。
访问过,就留在databuffer中了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21143887/viewspace-706933/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21143887/viewspace-706933/