查看: 18002|回复: 40

ORACLE ROWID

[复制链接]
论坛徽章:
57
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010新春纪念徽章
日期:2010-03-01 11:21:02
跳转到指定楼层
1#
发表于 2006-10-24 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
oracle rowid :

在8i以前rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ,22 bit 的 block# ,16 bit 的 row#。
其中oracle 的dba(data block address)是32 bits的,包括10 bit 的 file# 和 22 bit 的block#。
由于不存在0编号文件,oracle中的文件最大数量2^10-1=1023
而datafile能达到的最大size就是2^22*db_block_size
如果db_block_size为4k的datafile max size就是16G
如果db_block_size为8k的datafile max size就是32G

从oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间,
32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#.由于rowid的组成从file#变成了rfile#,
所以数据文件数的限制也从整个库不能超过1023个变成了每个data_object_id不能超过1023个数据文件。当然,你或许要问,
为什么oracle不调整rowid中表示 file# 的 bit数量,这个应该是由于兼容性的引起的,在 oracle7 的索引中存储的rowid
就是 file# + block# + row# ,因为这样处理后关于索引的存储,oracle8和oracle7没有发生变化。

虽然oracle使用了extend rowid,但是在普通索引里面依然存储了bytes的rowid,只有在global index中存储的是10bytes
的extend rowid,而extend rowid也是global index出现的一个必要条件。

我们可以用如下方法研究rowid的详细内容。

SQL> select dbms_rowid.ROWID_OBJECT(rowid) data_object_id#,
2 dbms_rowid.ROWID_RELATIVE_FNO(rowid) rfile#,
3 dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,
4 dbms_rowid.ROWID_ROW_NUMBER(rowid) row#
5 from test where rownum<10;

DATA_OBJECT_ID# RFILE# BLOCK# ROW#
--------------- ---------- ---------- ----------
24382 8 90 0
24382 8 90 1
24382 8 90 2
24382 8 90 3
24382 8 90 4
24382 8 90 5
24382 8 90 6
24382 8 90 7
24382 8 90 8

9 rows selected


SQL> select dump(rowid,16) rid from test where rownum<10;

RID
--------------------------------------------------------------------------------
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,0
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,1
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,2
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,3
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,4
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,5
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,6
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,7
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,8

9 rows selected

SQL> select dump(rowid) rid from test where rownum<10;

RID
--------------------------------------------------------------------------------
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,0
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,1
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,2
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,3
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,4
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,5
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,6
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,7
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,8

9 rows selected

ROWID的显示规则:

第1~6位表示data_object_id#第7~9位是表示的是数据文件,而10~15位表示的是在这个数据文件中的第几个BLOCK。rowid编码相当于64进制。
用A~Z a~z 0~9 + /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63。

SQL> select dbms_rowid.ROWID_OBJECT(rowid) data_object_id#,
  2  dbms_rowid.ROWID_RELATIVE_FNO(rowid) rfile#,
  3  dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,
  4  dbms_rowid.ROWID_ROW_NUMBER(rowid) row#,
  5  rowid
  6  from test where rownum<10;

DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW# ROWID
--------------- ---------- ---------- ---------- ------------------
          24382          8         90          0 AAAF8+AAIAAAABaAAA
          24382          8         90          1 AAAF8+AAIAAAABaAAB
          24382          8         90          2 AAAF8+AAIAAAABaAAC
          24382          8         90          3 AAAF8+AAIAAAABaAAD
          24382          8         90          4 AAAF8+AAIAAAABaAAE
          24382          8         90          5 AAAF8+AAIAAAABaAAF
          24382          8         90          6 AAAF8+AAIAAAABaAAG
          24382          8         90          7 AAAF8+AAIAAAABaAAH
          24382          8         90          8 AAAF8+AAIAAAABaAAI

9 rows selected

看第一条数据:
24382 = AAAF8+ = 5 * 64^2 + 60 * 64 + 62
8 = AAI
90 = ABa = 1 * 64 +  26
论坛徽章:
8
ITPUB元老
日期:2007-09-07 13:34:44IT宝贝
日期:2009-03-16 13:01:072010新春纪念徽章
日期:2010-03-01 11:08:34
2#
发表于 2006-10-24 11:20 | 只看该作者
不错,UP

使用道具 举报

回复
论坛徽章:
64
会员2007贡献徽章
日期:2007-09-26 18:42:10NBA常规赛纪念章
日期:2008-04-18 19:48:16欧洲冠军杯纪念徽章
日期:2008-05-23 14:31:342009新春纪念徽章
日期:2009-01-04 14:52:28NBA常规赛纪念章
日期:2009-04-16 14:28:42NBA季后赛纪念徽章
日期:2009-06-16 11:28:172010新春纪念徽章
日期:2010-01-04 08:33:08
3#
发表于 2006-10-24 14:00 | 只看该作者
好东西,顶

使用道具 举报

回复
论坛徽章:
0
4#
发表于 2006-10-24 15:19 | 只看该作者
好人啊

使用道具 举报

回复
论坛徽章:
1
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
5#
发表于 2006-10-24 15:31 | 只看该作者
好帖子,顶

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2006-10-25 16:28 | 只看该作者
不错

使用道具 举报

回复
论坛徽章:
57
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010新春纪念徽章
日期:2010-03-01 11:21:02
7#
 楼主| 发表于 2006-11-1 17:11 | 只看该作者
在讲rowid的时候说到了文件大小的限制,忘记说了,这个限制在oracle10g已经没有了,Oracle 10g 的存储能力有了显著的增强,新增了表空间类型:大文件 (Bigfile) 表空间

大文件表空间从某种角度来说提高了 Oracle 在 VLDB 上的管理能力。 只有自动段空间管理的 LMT (Locally Managed Tablespaces ) 支持 BIGFILE 表空间。 大文件表空间只能包含一个文件,但是文件可以达到 4G 个数据块大小。(以下用 BFT 指代 BIGFILE Tablespace。)

BFT 可以和以下存储技术结合使用:

自动存储管理(ASM)
LVM
OMF
理论上的 BFT 可以达到下面所列的值:

数据块大小(单位:K) BFT 最大值(单位:T)
2k 8T
4k 16T
8k 32T
16k 64T
32k 128T

在实际环境中,这还受到操作系统的文件系统的限制。


更多内容参考于:

http://zhouwf0726.itpub.net/post/9689/223787

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2006-11-08 14:05:47BLOG每日发帖之星
日期:2009-04-03 01:01:06BLOG每日发帖之星
日期:2008-11-08 01:01:04数据库板块每日发贴之星
日期:2008-11-06 01:01:02生肖徽章2007版:鼠
日期:2008-01-02 17:35:53会员2007贡献徽章
日期:2007-09-26 18:42:10参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:02ITPUB元老
日期:2007-07-25 09:58:55数据库板块每日发贴之星
日期:2007-06-22 01:02:452010新春纪念徽章
日期:2010-03-01 11:08:33
8#
发表于 2006-11-1 17:22 | 只看该作者
zhouwf0726  辛苦了!
如果我们能把 一些基础 的东西分析透了, 一点点积累,肯定会有很大进步的。

zhouwf0726  这种方法很不错 , 学习。 希望能看到 更多这样的文章 !

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2005-10-30 17:05:33ITPUB元老
日期:2006-08-18 16:42:07生肖徽章:猪
日期:2007-01-25 16:52:00生肖徽章:蛇
日期:2007-01-25 16:58:03会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鼠
日期:2008-01-02 17:35:532010新春纪念徽章
日期:2010-03-01 11:19:06
9#
发表于 2006-11-1 17:44 | 只看该作者
好帖。你的blog的内容也非常好。一定好好看看

使用道具 举报

回复
论坛徽章:
2
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
10#
发表于 2006-11-1 17:52 | 只看该作者
对 BIGFILE的分析果然有趣

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表