我们可能对oracle的rowid的使用并不陌生不过如果仔细分析一下发现其还是有些知识点
rowid是一个伪列是用来确保表中行的唯一性它并不能指示出行的物理位置但可以用来定位行 rowid是存储在索引中的一组既定的值(当行确定后)我们可以像表中普通的列一样将它选出来
利用rowid是访问表中一行的最快方式
rowid需要个字节来存储显示为位的字符串
rowid的组成结构为
data object number(位字符串)+relative file number(位字符串)+block number(位字符串)+row number(位字符串)如AAAADeAABAAAAZSAAA
我们可以借助oracle提供的包dbms_rowid来对rowid进行解析从而获取关于行的相关信息
bossdbSQL>select
rowid
dbms_rowidrowid_object(rowid) obj_id
dbms_rowidrowid_relative_fno(rowid) df#
dbms_rowidrowid_block_number(rowid) blknum
dbms_rowidrowid_row_number(rowid) rowno
from p_test where rownum<;
ROWID OBJ_ID DF# BLKNUM ROWNO
AAAQ+tAANAAACSAAA AAAQ+tAANAAACSAAB AAAQ+tAANAAACSAAC AAAQ+tAANAAACSAAD
我们可以看到通过rowid_row_number得到的行号是从开始的这是和rownum伪列的一个不同之处我猜测rowid_row_number在求行号的时候是计算首行的偏移量
一般来说当表中的行确定后rowid就不会发生变化
但当如下情况发生时rowid将发生改变
对一个表做表空间的移动后
对一个表进行了EXP/IMP后