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

崖山数据库的ROWID高度兼容Oracle语法,是HEAP堆表的伪列,代表行的物理存储地址,同时也是一种原生数据类型。
⚠️ 仅支持HEAP堆表;列存表、分布式部署场景不支持ROWID伪列。
![]() |
|---|
| 点击这里查看视频讲解:【赵渝强老师】崖山数据库的行地址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.


浙公网安备 33010602011771号