【赵渝强老师】崖山数据库的行地址ROWID

b475

崖山数据库的ROWID高度兼容Oracle语法,是HEAP堆表的伪列,代表行的物理存储地址,同时也是一种原生数据类型。

⚠️ 仅支持HEAP堆表;列存表、分布式部署场景不支持ROWID伪列。

image.png
点击这里查看视频讲解:【赵渝强老师】崖山数据库的行地址ROWID

1. 基础概念

  • 伪列:不在表的字段定义中,select *不会返回,必须显式写select rowid查询;不能insert/update修改ROWID伪列。
  • 数据类型:ROWID类型固定占16字节二进制;UROWID通用ROWID变长1‑8000字节,用来存ROWID二进制,等价RAW类型。
  • 输出格式示例:1350:5:0:148:0,冒号分隔,和Oracle的18位Base64字符串格式不一样。

Oracle输出:AAAW78AABAAAFWXAAA(Base64串)
YashanDB输出:对象ID:文件号:段:块号:块内行号

2. ROWID结构

输出格式:ObjectId:FileId:SegId:BlockId:SlotId

片段 含义
ObjectId 表对象ID
FileId 数据文件编号
SegId 段编号
BlockId 数据块号
SlotId 块内部行槽号(行号)

配套包DBMS_ROWID,提供函数解析rowid,获取块号、文件号、行槽号,用法和Oracle的DBMS_ROWID兼容,分布式集群不可用。

3. 核心特性

  • 仅HEAP堆表生效:列存表、分布式表不能使用ROWID伪列;单机/共享集群HEAP表可用。
  • ROWID会变化的场景
    • 更新导致行迁移、行溢出;
    • ALTER TABLE MOVE、表重组、收缩;
      删除后新插入行可能复用旧ROWID。
  • 同一张HEAP表内部ROWID唯一;不同表ROWID可以重复,不能跨表做对比。
  • 可以把ROWID作为普通字段类型,建表时定义列类型为ROWID,用来存储行地址;Oracle不允许把ROWID作为字段类型,这是一个重要差异。
  • MySQL兼容模式下,伪列别名是__ysmy_rowid,Oracle模式直接使用ROWID关键字。

4. 常用SQL示例

-- 查询rowid伪列(Oracle兼容模式)
SQL> select rowid,deptno,dname from dept;

ROWID                                              DEPTNO DNAME         
-------------------------------------------- ------------ ------------- 
2821:4:0:132:0                                         10 ACCOUNTING   
2821:4:0:132:1                                         20 RESEARCH     
2821:4:0:132:2                                         30 SALES        
2821:4:0:132:3                                         40 OPERATIONS   

4 rows fetched.

-- 根据rowid快速定位行,查询性能极高
SQL> select deptno,dname from dept where rowid='2821:4:0:132:2';

      DEPTNO DNAME         
------------ ------------- 
          30 SALES        

1 row fetched.
posted @ 2026-10-07 09:27  赵渝强老师  阅读(4)  评论(0)    收藏  举报