1、select ROWID from TT WHERE ROWNUM=1 FOR UPDATE 获取到一个ROWID:'AAAOcTAAJAAAAASAAB'
2、ROWID 可以分为4段进行解析,使用64进制方式存储
AAAOcT AAJ AAAAAS AAB
段名称 相对文件编号 数据块编号 数据块上第几条记录
3、其中A-Z代表0-25,a-z代表26-51,0-9代表52-61,+代表62,/代表63
4、换算AAAOcT=14*64*64+28*64+19=59155
AAJ =9
AAAAAS=18
AAB =1
5、通过select owner,object_name,object_id,data_object_id from dba_objects t where object_id = 59155
可以看到: SYS TT 59155 59155
其中object_id和data_object_id在正常情况下是相等的,在truncate和move表后,data_object_id会发生变更
其实object_id和data_object_id同样是表示数据库对象的一个唯一标志,但是object_id表示的是逻辑id,data_object_id表示的是物理id。
如果一些object没有物理属性的话那它就不存在data_object_id,例如procedure,function,package,data type,db link,mv定义,view定义,临时表,分区表定义等等这些
object都是没有对应着某个segment,因此它们的data_object_id都为空。
例如:先创建一个表TTT:create table ttt as select * form tt where rownum<10
然后select owner,object_name,object_id,data_object_id from dba_objects t where object_NAME = 'TTT'可以看到如下结果:
SYS TTT 59164 59164
执行truncate table TTT后再执行select owner,object_name,object_id,data_object_id from dba_objects t where object_NAME = 'TTT'
SYS TTT 59164 59165
其中data_object_id发生了改变。
使用alter table TTT move后再执行select owner,object_name,object_id,data_object_id from dba_objects t where object_NAME = 'TTT'
SYS TTT 59164 59168
其中data_object_id也发生了改变。
6、使用SELECT FILE_ID,RELATIVE_FNO,TABLESPACE_NAME FROM DBA_DATA_FILES T WHERE T.file_id='9';