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

ROWID in B-Tree Index

在B-Tree索引的叶子节点,不光存放了索引列值,还保存这个列值所对应的的ROWID,以便快速定位。一个查询过程如:

上图的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.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值