一: rowid 组成

  • (1)The data object number of the object
  • (2)The data block in the data file in which the row resides
  • (3)The position of the row in the data block (first row is 0)
  • (4)The data file in which the row resides (first file is 1). The file number is relative to the tablespace.

二: rowid 重要用途

Rowid values have several important uses:

  • (1)They are the fastest way to access a single row.
  • (2)They can show you how the rows in a table are stored.
  • (3)They are unique identifiers for rows in a table.

三: rowid 限制

Small Datafile
Max(一个表空间的数据文件数)=(2^10)-1=1023
Max( 一个数据文件包含块数 )=2^22=4194304=4M(block)
Max( 一个 block 包含行数 )=2^16=65536=64k(rows)
Max(一个数据库内object 个数 )=2^32=4294967296=4G(objects)
Bigfile Datafile
Max(一个表空间的数据文件数)=1
Max( 一个数据文件包含块数 )=2^(22+10)=4294967296=4G(block)
Max( 一个 block 包含行数 )=2^16=65536=64k(rows)
Max(一个数据库内object 个数 )=2^32=4294967296=4G(objects)

测试如下:
(1) 创建测试数据

SQL> createtablespacechenjch_tbs datafile'/u01/app/oracle/oradata/cc/chenjch_tbs01.dbf'size10M autoextendonmaxsize1G;
SQL> createuserchenjch identifiedbya defaulttablespacechenjch_tbs;
SQL> grantconnect,resource,dbatochenjch;
SQL> createtablet1 asselect*fromscott.emp;
SQL> createtablet2 asselect*fromscott.dept;

(2) 查看 t1 表 rowid 信息
SQL> SELECTrowid,empno fromt1 a orderbyempno;

SQL>
selectsubstr(rowid,1,6)"object",
substr(rowid,7,3)"file",
substr(rowid,10,6)"block",
substr(rowid,16,3)"row"
fromt1;
---取出任意一行rowid
AAAVV9AAFAAAACDAAC
---通过rowid计算对应的obj#,rfile#,block#,row#;
(1)obj#=AAAVV9=2164^2+2164+61= 87421
(2)rfile#=AAF= 5
(3)block#=AAAACD=2*64+3= 131
(4)row#=AAC= 2

--- 也可以通过dbms_rowid转换得到相应的 obj#,rfile#,block#,row#;

SQL>
se lectdbms_rowid.rowid_object(rowid)object_id,
dbms_rowid.rowid_relative_fno(rowid)file_id,
dbms_rowid.rowid_block_number(rowid)block_id,
dbms_rowid.rowid_row_number(rowid)row_number,
ROWID,
empno
fromT1
orderbyempno;

(3)rowid 和限制
Small Datafile
rowid 采用 10 个 byte 来存储 =8*10=80bit ,
其中 :
obj# 占用 32bit ;
rfile# 占用 10bit ;
block# 占用 22bit ;
row# 占用 16bit 。
Max(一个表空间的数据文件数)=(2^10)-1=1023
Max( 一个数据文件包含块数 )=2^22=41943044=4M(block)
Max( 一个 block 包含行数 )=2^16=65536=64k(rows)
Max(一个数据库内object 个数 )=2^32=4294967296=4G(objects)

Bigfile Datafile
rowid 采用 10 个 byte 来存储 =8*10=80bit ,
其中 :
obj# 占用 32bit ;
rfile# 占用 0bit ;
block# 占用 32bit ;
row# 占用 16bit 。
Max(一个表空间的数据文件数)=2^0=1
Max( 一个 block 包含行数 )=2^16=65536=64k(rows)
Max(一个数据库内object 个数 )=2^32=4294967296=4G(objects)
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!
转载自chenoracle

最后修改:2022 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏