1、为什么使用rowid 新的rowid使用相对值,所以必须存放segment的标示,否则就会混淆。所以orac 2、rowid的结构 3、tablespace-relative寻址方式 4、data object number 最开始的时候,dba_objects.object_id=dba_objects.data-object_id,但是在 6、扩展的rowid 7、在oracle8中使用oracle7的rowid 8、application的移植问题 10、dbms_rowid包 dbms_rowid.rowid_to_extended dbms_rowid.rowid_verify dbms_rowid.create
oracle把rowid作为b-树和其内部算法标示row的唯一标示。
在oracle8以前的版本中,rowid标示file、block、row number,只用一个数字代
表file号。
在oracle8中,一个datafile有两个数字代表:
一个绝对值,是整个数据库唯一的。可以看dba_data_files中的file_id。
一个相对值,在tablespace中是唯一的,可以看dba_data_files中的relative_
fno。
le8在rowid中加入对象的segment号,用来标示table或者partition。
使用base-64代码,包括a-z,a-z,0-9,+,-。一共18位。
1-6位:代表object
7-9位:文件相对值
10-15:文件中的block
16-18:block中的slot值
使用的是tablespace-relative寻址方式,多个文件可以有相同的相对值,因为它
们属于不同的tablespace,所以不能从新的rowid得到绝对地址,但是这没有问题
,因为当要处理某个object时,已经能确定它属于哪个tablesapce了。在tables
pace中,文件相对值是唯一的,所以rowid还是可以唯一标示一个object。table
space-relative寻址方式是oracle8中支持超大数据库的关键技术。
data object number用于指示segment,所有segment都有data object number,
存放在每个data block中,而且不重复。
上述情况下data-object_id会在如下情况下增加
truncate table
move partition
oracle会检查rowid中的data object number和block中的data object number,
保证他们之间的版本是一致的。
oracle也使用data object number以确保rollback的纪录和最新的segment纪录一
致。
要注意的是data object number不是object 的标志
5、restricted rowid
oracle7的rowid格式是
1-8位:block number
9-12位:row number
13-16位:file number
oracle8支持短的、旧格式的rowid,作用是
对nopartition table的index entry
对partition table的local index entry
row piece chain pointer
受限rowid的内部存放是6byte,
4byte=data block number
2byte=row number
这就是说,index entry使用6byte存放该rowid,这对大多数index足够了。但是
这种短rowid不能使用在patition table的global index上,因为partition可能
跨tablespace。显示这种rowid依然是18位的
oracle在内部存放时候是10 byte,包括(data object number,data block nu
mber,row number)
oracle8使用扩展的rowid:
partition table 的global index
server 算法
扩展的rowid在select时,依然是18位的显示,存放在rowid字段中。
从oracle8的db中查询oracle7的rowid时候,rowid返回的是oracle7的格式,也可
以用在where语句中。
从oracle7的db中查询oracle8的rowid时候,rowid返回的是oracle8的格式,也可
以用在where语句中,但是不能存放在rowid字段中。但是你要用dbms_rowid 包来
解释之。
如果包含扩展的oracle8 rowid,这不能把oracle8的数据import到oracle7中。从
oracle7中可以import到oracle8中。
一般程序的移植应该没有问题。只有在下面情况下才考虑移植问题:
application使用了rowid
table包括rowid类型的字段
如果程序有如下情况,必须使用dbms_rowid包:
自己组合rowid
自己分解rowid
如果仅仅是传递rowid到变量、或者仅仅做为一个整体使用,则可以不受影响。
9、数据的移植问题
无论使用export/import还使用移植工具,oracle7中的rowid字段到了oracle8中
就自动扩展。
如果在某个字段内容中包含rowid,则必须手工用dbms_rowid包来转换。
由$oracle_home/rdbms/admin/dbmsutil.sql创建,其实在catproc.sql中包含着
。提供处理rowid的一些函数。
rowid_create
rowid_info
rowid_type
rowid_object
rowid_relative_fno
rowid_block_number
rowid_to_absolute_fno
rowid_to_extended
rowid_to_restricted
rowid_verify
(old_rowid in rowid,
schema_name in varchar2,
object_name in varchar2,
conversion_type in number
)
return rowid;
转换受限rowid到扩展rowid,用于转换旧的rowid到oracle8的格式。
dbms_rowid.rowid_to_restricted
转换扩展的rowid到受限的rowid。
判断一个受限的rowid是否可以转换到扩展的格式
dbms_rowid.row_info
用于解释rowid,可以得到data object number,relative file number,block
number和row number。
生成rowid。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器