崖山数据库的ROWID高度兼容Oracle语法,是HEAP堆表的伪列,代表行的物理存储地址,同时也是一种原生数据类型。
⚠️ 仅支持HEAP堆表;列存表、分布式部署场景不支持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
配套包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.