Oracle ROWID

对于数据库中的每一行,都有一个叫ROWID的伪列(Pseudocolumn,伪列即不存储在表中,但是像一个表列的列,这个列不能insert、update、delete),用于标记记录物理位置的一个ID,所以ROWID最大的作用就是 快速定位记录。

ROWID的组成
ROWID字段由18个字符组成,如: OOOOOOFFFBBBBBBRRR
OOOOOO表示数据库对象编号
FFF表空间中的数据文件编号
BBBBBB存储记录的数据块的编号
RRR标示同一数据块中不同的记录
样例:AAAAVJAAEAAAABEAAA

SELECT ROWID, ENAME
FROM EMP
WHERE EMPNO = 7369;
Output:
ROWID                                 ENAME
AAAR3sAAEAAAACXAAA        SMITH

ROWID是否可以用在Where条件中
ROWID可以作为WHERE条件来查询记录,但因为记录物理位置是可能发生变化的,所以在程序中用ROWID查询数据是一个不靠谱的事情。
SELECT * FROM EMP WHERE ROWID = 'AAAR3sAAEAAAACXAAA'

ROWID什么情况会发生变化
  • Doing an export or import of the table
  • Doing ALTER TABLE XXXX MOVE
  • Doing ALTER TABLE XXXX SHRINK SPACE
  • Doing FLASHBACK TABLE XXXX
  • When splitting a partition
  • When updating a value so that it moves to a new partition
  • When combining two partitions

Row Piece in a Database Block
Oracle ROWID_第1张图片
ROWID in B-Tree Index
Oracle ROWID_第2张图片
在B-Tree索引的叶子节点,不光存放了索引列值,还保存这个列值所对应的的ROWID,以便快速定位。一个查询过程如:
Oracle ROWID_第3张图片
上图的SQL语句查找location_id为1800的行。首先在映射表中找到1800对应的physical rowid,再通过physical rowid找到对应的logical rowid,再通过logical rowid在IOT表中找到对应的行。

ROWID vs ROWNUM
ROWID is the unique physical address of every row of a table maintained by database automatically. ROWNUM is the sequential number allocated to each row in the result set object during query execution.

ROWID is permanent whereas ROWNUM is temporary. ROWID is 16-bit hexadecimal whereas ROWNUM is numeric.

你可能感兴趣的:(database)