- 浏览: 502471 次
- 性别:
- 来自: 济南
-
文章分类
最新评论
-
Ruby_lgr:
这样写了还是绕不过证书呢
httpclient 无信任证书使用https -
shihengli2010:
li2hengyuan 写道楼主 MySSLProtocol ...
httpclient 无信任证书使用https -
wangyudong:
很多API doc生成工具生成API文档需要引入第三方依赖,重 ...
httpclient 无信任证书使用https -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
CXF bus interceptor配置 -
xlzxlw:
多谢大师!帮到我了!这个类很有用!!感谢!!!
httpclient 无信任证书使用https
Oracle中的ROWID是数据的物理地址。一个ROWID包含关于文件、块和该块中的行的一行信息。ROWID还包含其它数据,如相关文件数和OBJECT_ID。
以下转自:http://hi.baidu.com/55358669/blog/item/3aa82334c7a8713b5bb5f5d3.html
ROWID可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。本文主要关注物理rowid。
物理rowid又分为扩展rowid(extended rowid)和限制rowid(restricted rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经不再使用,保留该类型只是为了兼容性。所以本文的提到物理rowid一般是指扩展rowid格式。
1.Rowid的显示形式
我们从rowid伪列里select出来的rowid是基于base64编码,一共有18位,分为4部分:
OOOOOOFFFBBBBBBRRR
其中:
OOOOOO: 六位表示data object id,根据object id可以确定segment。关于data object id和object id的区别,请参考http://www.orawh.com/index.php/archives/62
FFF: 三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定datafile。关于相对文件号和绝对文件号,请参考http://blog.itpub.net/post/330/22749
BBBBBB:六位表示data block number。这里的data block number是相对于datafile的编号,而不是相对于tablespace的编号。
RRR:三位表示row number。
Oracle提供了dbm_rowid来进行rowid的一些转换计算。
SQL> create table test(id int,name varchar2(30));
Table created.
SQL> insert into test values(1,'a');
1 row created.
SQL> commit;
Commit complete.
SQL> select rowid from test;
ROWID
------------------
AAAGbEAAHAAAAB8AAA
SQL> select dbms_rowid.rowid_object(rowid) obj#,
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 dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST') file#
6 from test;
OBJ# RFILE# BLOCK# ROW# FILE#
----------- ------------ ------------- ---------- ----------
26308 7 124 0 7
2. 如何从rowid计算得到obj#,rfile#,block#,row#
rowid是base64编码的,用A~Z a~z 0~9 + /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63可以将其看做一个64进制的数。
所以,
obj#=AAAGbE=6*64^2+27*64+4=26308
rfile#=AAH=7
block#=AAAAB8=64+60=124
row#=AAA=0
3. 如何从obj#,rfile#,block#,row#计算得到rowid
实际上就是将十进制数转化成64进制数,当然,从二进制转化的规则比较简单点。
将二进制数从右到左,6个bit一组,然后将这6个bit组转成10进制数,就是A~Z a~z 0~9 + /这64个字符的位置(从0开始),替换成base64的字符即可。
obj#=26308=110 011011 000100=6 27 4=G b E,补足成6位base64编码,左边填0,也就是A,结果为AAAGbE
rfile#=7=111=7=H,补足成3位,得到AAH
block#=124=1 111100=1 60=B 8,补足成6位,得到AAAAB8
row#=0,3位AAA
合起来就是AAAGbEAAHAAAAB8AAA
4. Rowid的内部存储格式
虽然我们从rowid伪列中select出来的rowid是以base64字符显示的,但在oracie内部存储的时候还是以原值的二进制表示的。一个扩展rowid采用10个byte来存储,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相对文件号不能超过1023,也就是一个表空间的数据文件不能超过1023个(不存在文件号为0的文件),一个datafile只能有2^22=4M个block,,一个block中不能超过2^16=64K行数据。而一个数据库内不能有超过2^32=4G个object。
SQL> select dump(rowid,16) from test;
DUMP(ROWID,16)
--------------------------------------------
Typ=69 Len=10: 0,0,66,c4,1,c0,0,7c,0,0
00000000 00000000 01100110 11000100 00000001 11000000 00000000 01111100 00000000 00000000
最右边16bit为row#=00000000 00000000=0
接下来22bit为block#=000000 00000000 01111100=124
接下来10bit为rfile#=00000001 11=7
接下来32bit为obj#=00000000 00000000 01100110 11000100=26308
5. Index中存储的rowid
a. 普通B-tree索引
SQL> create index ix_test on test(id);
Index created.
SQL> select file_id,block_id from dba_extents where segment_name='IX_TEST' and owner=user;
FILE_ID BLOCK_ID
---------- ----------
7 129
---由于是assm表空间,去掉3个block的头
SQL> alter system dump datafile 1 block 132;
System altered.
得到trace文件内容如下(省略无关内容):
row#0[8024] flag: -----, lock: 0
col 0; len 2; (2): c1 02 ---索引键数据ID=1
col 1; len 6; (6): 01 c0 00 7c 00 00 ---对应的rowid记录
----- end of leaf block dump -----
End dump data blocks tsn: 7 file#: 7 minblk 132 maxblk 132
普通索引中保存的rowid是不包括obj#的,但是分区表的global index是包括obj#的,这是因为分区表包括多个segment,每个segment可能在不同的datafile中,根据表的obj#就无法确定该索引键对应的rowid(rfile#确定不了)。
01 c0 00 7c 00 00 转化为二进制 000000001 11000000 00000000 01111100 00000000 00000000
右边8bit row#=0
接下来22bit block#=000000 00000000 01111100=124
接下来10bit rfile#=000000001 11=7
b.唯一索引
SQL> drop index ix_test;
Index dropped.
SQL> create unique index ix_test on test(id);
Index created.
SQL> select file_id,block_id from dba_extents where segment_name='IX_TEST' and owner=user;
FILE_ID BLOCK_ID
---------- ----------
7 129
SQL> alter system dump datafile 1 block 132;
System altered.
得到trace文件内容如下:
row#0[8025] flag: -----, lock: 0, data:(6): 01 c0 00 7c 00 00 ---对应的rowid记录
col 0; len 2; (2): c1 02 ---索引键数据ID=1
----- end of leaf block dump -----
End dump data blocks tsn: 7 file#: 7 minblk 132 maxblk 132
得到rowid为 01 c0 00 7c 00 00,具体的转换计算和前面的一样,就不重复了。
发表评论
-
【转】CAP原理和BASE思想
2011-06-14 17:17 1128分布式领域CAP理论,Cons ... -
dmp 文件大小与数据条数的关系
2011-01-18 11:13 25741M的dmp文件 ≈ 1W条数据量 ≈ 1M dbf -
CBO,RBO在ORACLE中的应用
2011-01-13 11:02 2029ORACLE 提供了CBO、RBO两种 ... -
oracle 临时表
2011-01-13 09:36 12561 定义 临时表(Temporary table) ... -
oracle exp 中有关direct使用
2011-01-12 14:49 1326Oracle提供2种模式导出表数据,传统模式CONVENT ... -
转:如何搭建一个数据库服务器平台
2011-01-06 17:30 1506玩Oracle 2年多了,从接触Oracle 到现在,一直没有 ... -
sqlplus 之缓存中sql的显示、清除、执行
2011-01-05 22:08 25761、编辑、运行sql语句命令 注:这里所指的sql语句包括: ... -
SGA PGA
2011-01-05 13:26 1556一、SGA 1 SGA 基础 1 ... -
OLTP 和 OLAP
2011-01-04 14:29 1211联机事务处理OLTP(on-line transaction ... -
oracle 坏块
2010-12-31 17:24 2484Oracle 坏块 总结 收藏 ... -
oracle tbs segment、extent、block关系
2010-12-31 16:34 2884Oracle表空间(tableSpace)、段 (segmen ... -
EXP-00056: 遇到 ORACLE 错误 12535
2010-12-30 10:03 1530exp 导出dmp数据出现EXP-00056: 遇到 ORAC ... -
oracle 索引
2010-12-30 09:34 1626索引分类: 唯一索引,作用是数据约束,保证数据唯一,还有就 ... -
删除已连接用户
2010-12-30 09:28 9991 删除表空 drop tablespace tbs ... -
oracle后台进程与跟踪文件配置
2010-12-21 10:54 2527一 跟踪文件相关 (1) ... -
专用服务器进程与共享服务器进程
2010-12-21 09:34 1934oracle的服务器进程分为:专用(DEDICATED)服务器 ... -
oracle connet与resource权限详解
2010-12-20 17:42 8520首先用一个命令赋予user用户connect角色和resour ... -
oracle常用表及视图
2010-12-20 11:36 1105dba_开头 dba_users 数据库用户信息 ... -
oracle 常用视图之-----v$session
2010-12-20 11:21 2016作用:每一个连接到Orac ... -
oracle 常用视图之-----v$process
2010-12-20 11:05 15834v$process 视图 作用: v$process视 ...
相关推荐
本文重点探讨了一种基于Oracle RowID实现批量数据分页下载的方法,这种方法可以有效提高效率并减少对数据库的压力。 RowID是Oracle数据库中用于唯一标识每一行数据的物理地址,它不是用户可见的列,但可以在SQL查询...
mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句
"Oracle数据库rowid深入探析" Oracle数据库rowid是Oracle数据库中一个重要的概念,也是Oracle DBA考试中一个重要的知识点。rowid是Oracle数据库中的一种伪列,它可以唯一地标识表中的每一行。伪列类似于数据表的列...
Oracle的ROWID是一个重要的概念,它是数据库中每一行记录的物理地址标识,允许快速定位到数据存储的具体位置。ROWID由一系列的十六进制数字组成,包含数据对象编号、文件编号、块编号以及行编号,这四个部分共同构成...
Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid
### Oracle中用Rowid查找和删除表中的重复记录 在Oracle数据库管理中,处理重复记录是一项常见的需求,尤其是在数据量较大的情况下。本文将详细介绍如何利用Rowid这一特性来有效地查找和删除表中的重复记录。 ####...
ROWID是Oracle中一种特殊的数据类型,用于表示数据库表中每条记录的物理地址。ROWID可以被用来快速定位到表中的特定行,因此对于基于ROWID的查询非常高效。 --- 以上是从Tianlesoftware Oracle 学习手册(v1.0)中...
**ROWID** 是 Oracle 数据库中一个非常重要的概念,它是一种特殊类型的列,用于唯一标识表中的一行数据。ROWID 的格式通常包含数据对象号 (Data Object Number)、相对文件号 (Relative File Number)、块号 (Block ...
Oracle的ROWID类型可以直接对应到DB2/400中的ROWID类型,但在使用时需注意功能上的细微差别。 综上所述,Oracle和DB2/400在数据类型上存在显著差异,特别是在日期时间类型、数值类型、字符类型和大对象类型方面。...
ROWID在Oracle中是一种特殊的数据类型,可以通过它来快速访问特定的行。在需要检查重复值或其他与ROWID有关的操作时,可以在任何表中创建和使用ROWID列。 #### 四、限制索引 在实际应用中,一些开发人员可能会因为...
8. **ODBC连接ORC**:这里的“ORC”可能是指Oracle的数据类型,如Oracle ROWID,ODBC驱动程序需要正确处理这些特定于Oracle的数据类型。 9. **文档的重要性**:压缩包中包含的使用文档是宝贵的资源,很可能记录了...
文档中还提到了Oracle Rowid的概念,Oracle Rowid是Oracle数据块中的一个伪列,它包含了指向数据行存储位置的唯一地址。在某些情况下,可以用来优化查询操作。 文档的作者在学习Oracle数据库的过程中,参考了多位...
ROWID是Oracle中的一种特殊数据类型,表示表中每一行的物理地址。通过ROWID可以直接定位到具体的物理位置,因此可以极大地提高查询效率。 综上所述,本文档通过对Oracle的基础知识进行了深入的探讨,特别是对OLTP和...
1.2.9 Oracle ROWID:每个Oracle表都具有一个伪列ROWID,代表每行数据在数据库中的唯一物理地址,对于优化查询和维护数据块非常有用。 1.2.10 选择性:索引的“选择性”是指不同值占总行数的比例,选择性越高,...
- **索引与ROWID**:ROWID是指Oracle为每一行分配的唯一地址。索引可以通过ROWID快速定位到表中的具体行。 - **索引的选择性**:索引的选择性是指索引键值在表中出现的独特程度。如果索引键具有高选择性(例如,护照...
*.*.*.* Oracle ROWID:ROWID是Oracle中的伪列,指向表中每行的物理位置。Oracle使用ROWID来快速访问表中的数据行。 *.*.*.** 选择性:选择性是指某列中不同值的数目与表中总行数的比例。选择性高的列使用索引的...
ROWID是Oracle中唯一标识每一行的地址,它提供了一种直接访问数据行的方式。在处理行级别的操作时,ROWID是非常有用的,例如查找重复值或对ROWID的直接引用。 **限制索引** 索引的使用受限于查询语句的编写方式。...
Oracle ROWID是每个行的唯一标识,它直接指向数据行的位置。通过ROWID,可以高效地定位和访问单行数据。在处理重复值检查或ROWID相关操作时,ROWID列可以在任何表中使用。 接着,我们讨论了限制索引的情况,这是...