ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于ROWID

关于ROWID

原创 Linux操作系统 作者:ivanding 时间:2009-02-05 14:27:47 0 删除 编辑

1、rowid的分类
physical rowid:
restricted rowid受限的rowid:如0000032D.0000.0004(0000032D表示block#,0000表示row#,0004表示absolute file#)
exetended rowid扩展的rowid:如AAAOAMAAEAAAAMtAAA
logical rowid:Logical Rowids 主要是用在iot类型的表上。oracle创建或者生成Logical Rowids 是基于表的primary key,如果primary key不改变则Logical Rowids 就不会发生变化。Logical Rowids 依赖primary key,所以创建iot类型的表不指定primary key是不行的。

2、object id和data object id的区别
object id:这是数据库对象在数据库级全局的编号,一旦创建后就不会再改变。
data object id:data_object_id是对象的逻辑编号,准确的说是segment的编号,由于segment存在表空间中,因此也可以说data_object_id是在表空间里的对象编号,或者说是segment的编号,如果segment发生变化,data_object_id是会改变的,诸如我们熟悉的move , truncate操作都会是data_object_id发生变化。

3、absolute fno和relative fno的区别
absolute fno:这是数据文件在数据库级的唯一编号。
relative fno:这是数据文件在表空间内的唯一编号,一般来说如果是普通的表空间里的数据文件,absolute fno和relative fno是一样的,除非整个数据库的数据文件超过了限制(一般为1023个),这时absolute fno和relative fno才会不一样。而bigfile tablespace的数据文件relative fno永远是1024。

4、extended rowid的结构
根据rowid的定义规则,第7~9位是表示的是数据文件,F表示5,而10~15位表示的是在这个数据文件中的第几个BLOCK,g表示32。(rowid编码相当于64进制。用A~Z a~z 0~9 + /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63。)

AAAOAM          AAE          AAAAMt       AAA
________        ___           ____       ___
       |                     |                   |               |
data object    Rfile#       block#       rowid#
id(32bit)         (10bit)      (22bit)        (16bit)

data object id:数据对象id,可以在dba_objects里找到对应的记录
rfile#:相对文件号
block#:在数据文件的第几个block里
rowid#:是这个block里的第几条数据。


5、dbms_rowid包说明
rowid_create可以根据输入的data_object_id,rfile#,blocked_id , row#生成rowid。

rowid_type:返回1表示是扩展的rowid,返回0表示受限的rowid

rowid_info:返回该rowid的全部信息。例如
DBMS_ROWID.ROWID_INFO(my_rowid, 'BIGFILE', rid_type, obj_num, file_num, block_num,
row_num);
DBMS_OUTPUT.PUT_LINE('The type is ' || rid_type);
DBMS_OUTPUT.PUT_LINE('Data object number is ' || obj_num);
-- and so on...

rowid_object:返回数据对象id

rowid_relative_fno:返回相对文件名

rowid_block_number:返回数据文件的第几个block

rowid_row_number:返回这个block的第几行

rowid_to_absolute_fno:返回绝对文件号,需要schema name,object name,例如
SELECT DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO(ROWID,'IVAN','T1') FROM T1
 
rowid_to_extented:将受限的rowid转换为扩展的rowid,需要参数schema name,object name。例如
UPDATE SCOTT.RIDS
   SET rowid_col =
   dbms_rowid.rowid_to_extended (
      rowid_col, 'SCOTT", TABLE_COL, 0);

rowid_to_restricted:将扩展的rowid转换为受限的rowid

rowid_verify:看看这个rowid能否转换成扩展的rowid,如果可以返回1,如果不能返回0,例如
SELECT ROWID, rowid_col
   FROM SCOTT.RIDS
   WHERE dbms_rowid.rowid_verify(rowid_col, [schema name], [object name], 0) =1;


 6、推导出来的数据库的限制
 1、单个表空间最多有1023个数据文件(文档上说依赖于OS,通常是1022,在windows下是1023)
 2、单个数据文件最多有2^22个block。
 3、单个block最多有2^16行。
 4、一个数据库最多有2^32个数据对象。

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

上一篇: 关于oracle的锁
下一篇: dba_lock
请登录后发表评论 登录
全部评论

注册时间:2009-01-20

  • 博文量
    9
  • 访问量
    9040