在oracle,rowid是一个很重要的概念。
简单来说rowid就是记录在oracle中的唯一标识
在oracle中有三种rowid:foreign rowid:logical rowid;physical rowid。其中physical rowid最常见,foreign rowid最不常见。
foreign rowid
foreign rowid即外部rowid,它是oracle数据库和其他数据库进行交互时用于唯一标识其他数据库中一条记录,如果你有幸实现oracle gateway,你可能会接触到foreign rowid。对于foreign rowid,只需要简单了解其概念即可。
logical rowid
logical rowid即逻辑rowid,用于索引组织表(IOT)的辅助索引中中。逻辑rowid由physical guess和逻辑主键两部分构成,physical guess由rdba构成,逻辑主键即IOT中的主键,其存储为主键第一列的长度+主键第一列实际的值+主键第二列的长度+主键第二列实际的值……
logical rowid的使用
在IOT中使用辅助索引时,oracle使用logical rowid定位记录所在的位置。oracle首先使用physical guess用来定位记录,由于IOT的特性,logical rowid中的physical guess可能已经失效。这个时候如果physical guess已经失效,oracle必须使用logical rowid中的逻辑主键再次进行扫描才能获得正确的数据。这就是logical rowid的使用过程。说道这里你应该对于IOT的使用有一定的理解……
physical rowid
physical rowid就是我们常说的rowid,physical rowid由80B构成,其中32B用于表示data_object_id,10B用于表示rfile,22B用于表示block_number,16位用于表示row_number。
要注意的有几点:
1:data_object_id和object_id是两个不同的概念,data_object_id是需要存储空间的对象的段号,有些对象没有data_object_id,有些对象有多个data_object_id。另外使用段头来唯一标识段即段头所在的相对文件号和块号(header_file和header_block)。
2:small表空间中使用10B用于表示rfile,22B用于表示block_number,所以一个small表空间中一个数据文件最大大小为db_block_size*(4M-1)。big表空间中使用32B表示block_number,big表空间只有一个数据文件。
3:不包含data_object_id的physical rowid称之为restricted rowid即受限rowid,包含data_object_id的physical rowid称之为unrestricted rowid即不受限rowid。在分区表中的本地索引和非分区表上的索引中存储的是受限rowid,在分区表的全局索引中存储的是不受限rowid。
4:唯一索引中,oracle把rowid放在row header中,非唯一索引中oracle把rowid放在索引键中
简单来说rowid就是记录在oracle中的唯一标识
在oracle中有三种rowid:foreign rowid:logical rowid;physical rowid。其中physical rowid最常见,foreign rowid最不常见。
foreign rowid
foreign rowid即外部rowid,它是oracle数据库和其他数据库进行交互时用于唯一标识其他数据库中一条记录,如果你有幸实现oracle gateway,你可能会接触到foreign rowid。对于foreign rowid,只需要简单了解其概念即可。
logical rowid
logical rowid即逻辑rowid,用于索引组织表(IOT)的辅助索引中中。逻辑rowid由physical guess和逻辑主键两部分构成,physical guess由rdba构成,逻辑主键即IOT中的主键,其存储为主键第一列的长度+主键第一列实际的值+主键第二列的长度+主键第二列实际的值……
logical rowid的使用
在IOT中使用辅助索引时,oracle使用logical rowid定位记录所在的位置。oracle首先使用physical guess用来定位记录,由于IOT的特性,logical rowid中的physical guess可能已经失效。这个时候如果physical guess已经失效,oracle必须使用logical rowid中的逻辑主键再次进行扫描才能获得正确的数据。这就是logical rowid的使用过程。说道这里你应该对于IOT的使用有一定的理解……
physical rowid
physical rowid就是我们常说的rowid,physical rowid由80B构成,其中32B用于表示data_object_id,10B用于表示rfile,22B用于表示block_number,16位用于表示row_number。
要注意的有几点:
1:data_object_id和object_id是两个不同的概念,data_object_id是需要存储空间的对象的段号,有些对象没有data_object_id,有些对象有多个data_object_id。另外使用段头来唯一标识段即段头所在的相对文件号和块号(header_file和header_block)。
2:small表空间中使用10B用于表示rfile,22B用于表示block_number,所以一个small表空间中一个数据文件最大大小为db_block_size*(4M-1)。big表空间中使用32B表示block_number,big表空间只有一个数据文件。
3:不包含data_object_id的physical rowid称之为restricted rowid即受限rowid,包含data_object_id的physical rowid称之为unrestricted rowid即不受限rowid。在分区表中的本地索引和非分区表上的索引中存储的是受限rowid,在分区表的全局索引中存储的是不受限rowid。
4:唯一索引中,oracle把rowid放在row header中,非唯一索引中oracle把rowid放在索引键中