示例演示通过rowid得到数据块的相关信息(所在对象,文件,数据块)

示例演示通过rowid得到数据块的相关信息(所在对象,文件,数据块)

rowOracle处理数据的最小单位,至少会扫描一行,也是lock的最小单位,不同用户可以修改不同的行,因为是行级锁由ITL事物槽控制。

rowid:我想大家对这个东东应该都不会陌生,说白了就是行的物理磁盘地址,由十六进制表示,由行头和行体组成。

行头:记录行的属性信息方便管理。

行体:记录字段的值,即数据。

下面我们来看看rowid在数据库中是如何表示的

 

SQL>drop table t purge;                 

 

表已删除。

 

SQL> create table t asselect * from dba_objects where object_id in (1,2,3);

 

表已创建。

SQL> selectrowid,object_id,object_name from t;

 

ROWID               OBJECT_ID OBJECT_NAME

---------------------------- --------------------

AAASTVAABAAAVS5AAA          3 I_OBJ#            表中记录对应的rowid

AAASTVAABAAAVS5AAB          2 C_OBJ#

 

我们数了一下rowid18位字符组成,每组字符代表不同的含义,18位最大寻址空间32G

AAASTV:对象id

AAB:文件id

AAAVS5id

AAA:行id

这四部分唯一标识了一行的物理地址,基于rowid的数据查询是最快的,比index还要快

下面我们使用DBMS_ROWID包来得到数据块的相关信息

 

SQL>  select rowid,dbms_rowid.rowid_object(rowid)object_id,

  2 dbms_rowid.rowid_relative_fno(rowid) file_id,

  3 dbms_rowid.rowid_block_number(rowid) block_id,

  4 dbms_rowid.rowid_row_number(rowid) row_id

  5  fromt;

 

ROWID               OBJECT_ID    FILE_ID  BLOCK_ID     ROW_ID

---------------------------- ---------- ---------- ----------

AAASTVAABAAAVS5AAA      74965          1     87225          0

AAASTVAABAAAVS5AAB      74965          1     87225          1

 

SQL>  select object_name from dba_objects whereobject_id=74965;

 

OBJECT_NAME

--------------------

T

上面两行记录的对象名即为t,所属文件号是5(同一个文件),所属块号是1459(同一个块),所属行号0(第一行)1(第二行)以此类推。

小结:如果我们想要了解数据行的物理结构,那么可以通过DBMS_ROWID包来得到数据行的相关信息。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值