ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 8k数据文件最大32g的原因

8k数据文件最大32g的原因

原创 Linux操作系统 作者:yanyp 时间:2010-06-25 23:10:03 0 删除 编辑

from:

Oracle rowid

Rowid简介

Rowid 是表的伪列,它用于惟一标识表行,并且间接给出了表行的物理位置,是定位表行最快的方式,使用insert语句插入数据时,oracle会自动生成rowid并将其值与表数据一起存放到表行中,oracle提供了扩展rowid(oracle 8及以后)和受限rowid(8i以前)两种rowid类型,
在8i以前rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ,22 bit 的 block# ,16 bit 的 row#(如下图)
由上图可以看到,数据文件地址有32bit,其中file#有10bit,block#有22bit
由于不存在0编号文件所以理论上一个数据库最大文件数为2^10-1=1023
而一个文件可以有包含2^22个blocks
如果db_block_size为4k的datafile max size就是2^22*4k =16G
如果db_block_size为8k的datafile max size就是2^22*8k =32G
从oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间
由于rowid的组成从file#变成了rfile#,所以数据文件数的限制也从整个库不能超过1023个变成了每个data_object_id不能超过1023个数据文件

查看rowid(本文讨论oracle10g)

rowid 用10个字节的存储空间,显示结果为18个字符, 1-6(object_id#), 7-9(rfile#), 10-15(block#), 16-18(row#),可以使用dbms_rowid函数把它们都调出来.如下:
SQL> select rowid ,
dbms_rowid.rowid_object(rowid) obj_id# ,
dbms_rowid.rowid_relative_fno(rowid) rfile# ,
dbms_rowid.rowid_block_number(rowid) block# ,
dbms_rowid.rowid_row_number(rowid) row#
from t
where rownum < 10;
 
ROWID                        OBJ_ID#     RFILE#    BLOCK#     ROW#
---------------------------------- -----------------
AAAHwuAABAAALmaAAA      31790          1      47514          0
AAAHwuAABAAALmaAAB      31790          1      47514          1
AAAHwuAABAAALmaAAC      31790          1      47514          2
AAAHwuAABAAALmaAAD      31790          1      47514          3
AAAHwuAABAAALmaAAE      31790          1      47514          4
AAAHwuAABAAALmaAAF      31790          1      47514          5
AAAHwuAABAAALmaAAG      31790          1      47514          6
AAAHwuAABAAALmaAAH      31790          1      47514          7
AAAHwuAABAAALmaAAI      31790           1      47514          8
 
简单使用
由于rowid惟一标识表行,并且间接给出了表行的物理位置,所以当我们查出block#后可以查到此行数据存放的具体位置
由上面的查询结果可以看到前9行记录的block#都为47514,这些block#所在的rfile#都为1,当知道rfile#就可以使用dba_data_files表查看它的具体位置.
查看dba_data_files表结构
SQL> desc dba_data_files
 Name                                      Null?    Type
 -------------------------- ----------------------------
 FILE_NAME                                          VARCHAR2(513)
 FILE_ID                                                NUMBER
 TABLESPACE_NAME                              VARCHAR2(30)
 BYTES                                                 NUMBER
 BLOCKS                                              NUMBER
 STATUS                                               VARCHAR2(9)
 RELATIVE_FNO                                      NUMBER
 AUTOEXTENSIBLE                                 VARCHAR2(3)
 MAXBYTES                                           NUMBER
 MAXBLOCKS                                        NUMBER
 INCREMENT_BY                                     NUMBER
 USER_BYTES                                        NUMBER
 USER_BLOCKS                                     NUMBER
查看数据file_id=1的物理位置
SQL> col file_name format a50
SQL> select file_name,file_id from dba_data_files where file_id=1;
 
FILE_NAME                                                 FILE_ID
------------------------------------ --------------
/u01/oradata/denver/system01.dbf             1
可见此行数据保存在/u01/oradata/denver/system01.dbf数据文件中.

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

上一篇: 转:opatch2
请登录后发表评论 登录
全部评论

注册时间:2009-04-12

  • 博文量
    139
  • 访问量
    196028