Oracle ROWID与RDBA

1.1     Rowid的意义

1.      Rowid就是用来标记表中每一行的行地址的,分为逻辑rowid,物理rowid和外部rowid,一般索引组织表的行地址使用逻辑rowid,堆组织表、 表簇、表分区、和索引分区的行地址使用物理rowid。外部rowid则是用来标识外来表(非oracle数据库的表)的行。

3.      Oracle 数据库在内部使用 rowids用于构造索引,最常见的 B 树索引,包含一个被划分成多个键范围的排序列表。索引键值(就是叶子节点)中存储了表每条记录的rowid,通过索引查找实际就是通过索引,找到记录的rowid,从而定位到表中的rowid代表的行。

所以,Rowid存在的意义:

Rowidsare the fastest means of accessing particular rows. –加快访问

Rowidsprovide the ability to see how a table is organized. –提供研究表组织方式的途径

Rowidsare unique identifiers for rows in a given table. –rowid是表中每一行的唯一标识符

1.2     Rowid也是一种数据类型

HR >alter table test addrowid_1 rowid;      ---增加一列可rowid的行

Table altered.

HR >insert into testvalues(sysdate-2,'AAAXR0AAdAAAAHdAAA');---插入要按照rowid规则,否则无效

1 row created.

HR >select t.*,t.rowidfrom test t;

ID                 |ROWID_1           |ROWID

-------------------|------------------|------------------.

2013-06-14 18:42:42|                  |AAAXR0AAdAAAAHdAAA

2013-06-1318:44:01|AAAXR0AAdAAAAHdAAA|AAAXR0AAdAAAAHdAAB

Rowid伪列(pseudo):

每个表都有以个伪列,类型就是rowid,用于标识每行的rowid。它不占用存储空间,也没法用describe查看。可以把它看成一个行数,不过每一行返回的值不一样。可以使用rowid列名来查看每一行的rowid,上面已经用到伪列了。

1.3     Rowid是怎么表示的?

以oracle8i为例(8i以来就没有改变,但是大文件表空间有点不一样!)

Rowid一共10字节,80bits,由四部分组成:分别是oooooooo.fff.bbbbb.rrrr,其中包括32bit的对象号。10bits的文件号,22bits的块号,16bits的行号(在一个块中)。从rowid的表示方法就知道:

一个表空间最多有1024个数据文件,除去全0和全1,是1022

一个数据文件最多有4m(2^22)个块,这就解释了为什么SMF数据文件最大是128G(块按照最大的32k计)。

一个块最多是65535(2^16)行。那么一个数据文件最大的行数就是2^38行,2千多亿行。

但是,rowid实际的表示方法为64base编码,可以去看看base64编码与数字,字母以及字符的对应表:

例如:AAANO8AAKAAAAF5AAA,

把这个rowid划分为4部分:按照6,3,6,3的划分规则

就是:AAANO8   AAK   AAAAF5   AAA

转换为十进制数:

对象编号:

60*(64^0)=60

14*(64^1)=896

13*(64^2)=53248

所以对象编号就是十进制的:53248+896+60=54204

转换为二进制数: 1101001110111100

同理,文件编号:K=10

块号:57+5*64=325

行号:0

1.4     RowID与rdba转换:

1.      使用字符串提取函数提取各部分(共四部分):

select rowid ,

substr(rowid,1,6) "OBJECT",

substr(rowid,7,3) "FILE",

substr(rowid,10,6) "BLOCK",

substr(rowid,16,3) "ROW"

from&TableName whererownum<=5;

HR >select rowid,

2 substr(rowid,1,6) "OBJECT",

3 substr(rowid,7,3) "FILE",

4 substr(rowid,10,6) "BLOCK",

5 substr(rowid,16,3) "ROW"

6  from&TableName where rownum<=5;

Enter value fortablename: test

old   6: from &TableName where rownum<=5

new   6: from test where rownum<=5

ROWID             |OBJECT      |FILE |BLOCK       |ROW

------------------|------------|------|------------|------

AAAXR0AAdAAAAHdAAA|AAAXR0      |AAd  |AAAAHd      |AAA

AAAXR0AAdAAAAHdAAB|AAAXR0      |AAd  |AAAAHd      |AAB

2.      使用包DBMS_GETROW实现到rdba的转换

selectrowid,

dbms_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) num

from &table_name whererownum<5;

HR >selectrowid,

2 dbms_rowid.rowid_object(rowid) object_id,

3 dbms_rowid.rowid_relative_fno(rowid) file_id,

4 dbms_rowid.rowid_block_number(rowid) block_id,

5 dbms_rowid.rowid_row_number(rowid) num

6  from&table_name where rownum<5;

Enter value fortable_name: test

old   6: from &table_name where rownum<5

new   6: from test where rownum<5

ROWID             | OBJECT_ID|   FILE_ID| BLOCK_ID|       NUM

------------------|----------|----------|----------|----------

AAAXR0AAdAAAAHdAAA|     95348|       29|       477|         0

AAAXR0AAdAAAAHdAAB|     95348|        29|       477|         1

3.      使用函数获取:

create or replace function get_rowid    --建立函数get_rowid

(l_rowid in varchar2)

return varchar2

is

---定义一些需要返回的变量

ls_my_rowid     varchar2(200);

rowid_type     number;

object_number     number;

relative_fno     number;

block_number     number;

row_number     number;

begin

object_number,relative_fno, block_number, row_number);

ls_my_rowid := 'Object#is      :'||to_char(object_number)||chr(10)||

'Relative_fnois :'||to_char(relative_fno)||chr(10)||

'Blocknumber is :'||to_char(block_number)||chr(10)||

'Rownumber is   :'||to_char(row_number);

return ls_my_rowid ;

end;

/

HR >selectget_rowid(rowid) from test;

GET_ROWID(ROWID)

Object#is      :95348

Relative_fnois :29

Block numberis :477

Row numberis   :0

Object#is      :95348

Relative_fnois :29

Block numberis :477

Row numberis   :1

1.5     特殊情况----大文件表空间

由于大文件表空间只有一个文件,那么它就没有必要拥有相对文件号了,他把原来的10位的文件号给了块号,这样块号有32位,就是4个g大小,这就证实了:当块大小为32k时候,大文件最大可以达到128t。

oracle由rowid查找表,Oracle ROWID与RDBA相关推荐

  1. oracle 12创建一个表,oracle 12 c 创建表空间,用户名,及表

    -----------------------------------------12C start------------------------------------------- -- 创建表 ...

  2. oracle数据库exp备份表,oracle数据库exp备份表

    Oracle exp/imp,备份或导入时注意的事项 Oracle exp/imp,备份或导入时注意的事项: 本篇主要讲述的是Oracle exp/imp备份导入的实际操作中需要注意的事项的介绍,凡事 ...

  3. oracle dba开头的表,oracle中以dba_、user_、v$_、all_、session_、index_开头的常用表和视图...

    oracle中以dba_.user_.v$_.all_.session_.index_开头的常用表和视图 ----------------------------------------------- ...

  4. oracle非管理员锁表,oracle默认管理员的帐号和密码以及密码修改和解除锁定

    安装 ORACLE 时,若没有为下列用户重设密码,则其默认密码如下: 用户名 / 密码 登录身份 说明 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMA ...

  5. oracle ebs hr模块表,oracle ebs常用表结构及分类模块.doc

    oracle ebs常用表结构及分类模块 Oracle application 表结构 表结构,WHO字段来实现 通过菜单HELP 下的HISTORY 来找表 2. 通过LAST_QUERY来判断所使 ...

  6. oracle 统计信息字典表,Oracle数据字典表查询

    /*显示当前用户*/ show user 在sql plus中可用,在pl sql中不可用 /*查看所有用户名*/selectusername,user_id,createdfromall_users ...

  7. 查看oracle已经锁定的表,Oracle中查询被锁定的表

    Oracle中查询被锁定的表 select --l.*,o.owner object_owner, o.object_Name,mac.status,mac.oSUSEr,mac.machine tr ...

  8. oracle 如何数组变成表,Oracle从零开始19——表的管理09——嵌套表和可变数组

    11.嵌套表(了解) 注意:基本不用. 例如:一个部门可能承接多个项目,那么按原始方法设计,应该这样定义两张表: CREATE TABLE department ( deptno        NUM ...

  9. oracle用命令方式创建表,oracle创建表的方法和一些常用命令

    1.主键和外键 主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(注意是组,可以是一个,也可以是多个)能唯一标识一条记录,那么该属性组就是主键 外键:关系型数据库表中的一列或者某几列 ...

最新文章

  1. python量化投资必背代码-基于python的开源量化交易,量化投资架构
  2. SecureFX连接Linux后文件夹中文乱码问题解决
  3. Docker: Failed to get D-Bus connection: No connection to service
  4. jsp中通过多种方式实现面包屑导航
  5. 查看mysql表中的所有索引
  6. 云漫圈 | 腾讯面试,我竟然输给了final关键字
  7. 微信小程序中处理 获取用户地址的回调
  8. pitch yaw roll是什么
  9. java多个文件下载之压缩包下载
  10. 2021年中国彩电行业发展现状分析,零售量首度跌破4000万大关,行业迎来艰难时刻「图」
  11. 修复windows修复引导_如何使用安全模式修复Windows PC(以及何时应该修复)
  12. 品味奢华 匠心独韵——飞利浦Fidelio T1设计与声音的哲学
  13. 如何在 Ubuntu 和其他 Linux 发行版中启动、停止和重启服务
  14. MySQL [1093] You can‘t specify target table ‘titles_test‘ for update in FROM clause
  15. 硬件工程师成长之路(3)——PCB设计
  16. 2019年二季度书单
  17. 小桥 流水 房子 水闸
  18. Anaconda安装python
  19. 广州系统集成项目管理工程师报考
  20. python基础教程:Django框架的中的setting.py文件说明详解

热门文章

  1. python计算圆内几等分点坐标
  2. 记录一次rediscluster 调用lua 脚本, 用于 list 批量获取
  3. linux段错误(Segmentation fault)调试方式
  4. [AHK]获取同花顺软件中的持仓信息
  5. 氮化镓充电器哪家做得好_【一点资讯】主流品牌已多达近10款: 氮化镓充电器怎么选? www.yidianzixun.com...
  6. Java - 微信支付
  7. ES5的继承和ES6的继承
  8. 量化投资学习——股指期货研究(一)
  9. Avalon总线(二)
  10. Redis专题——Redis管理工具