写点什么

YashanDB ROWID UROWID 类型

作者:YashanDB
  • 2025-03-28
    广东
  • 本文字数:1538 字

    阅读完需:约 5 分钟

本文内容来自 YashanDB 官网,原文内容请见 https://doc.yashandb.com/yashandb/23.3/zh/%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C/SQL%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/ROWID%20UROWID.html


YashanDB 单机、共享集群部署中表对象的默认存储方式为 HEAP 方式,数据按行(Row)组织,系统根据每一行数据所在物理地址信息生成一个全局唯一记录,即 ROWID。ROWID 用于检索表数据时的寻址,也可以用作每一行数据的唯一标识。


ROWID 是一种特殊的数据类型,既能作为数据类型被用户进行列字段声明,也能作为伪列(非表结构中定义的列,但可以被当作列字段进行查询)被使用。


UROWID(Universal ROWID)即通用 ROWID,在 YashanDB 中作为数据类型的一种,用于以二进制串形式存储行表的 ROWID。

存储属性




定义格式:


Size:宽度,表示最大字节长度。

数据格式



ROWID 的数据格式为dataoid:spaceid:fileid:blockid:dir


在用于存储行表的 ROWID 时,UROWID 的数据格式为0x1+ROWID的十六进制表述

# dataoid

data object id,行所在的 Segment 的 ID,该值可从 USER_OBJECTS 等视图中的 DATA_OBJECT_ID 字段查询获得。

# spaceid

space id,行所在的表空间的 ID,该值可从 V$TABLESPACE 等视图中的 ID 字段查询获得。

# fileid

file id,行所在数据文件在对应表空间中的数据文件 ID,该值可从 V$DATAFILE 等视图中的 ID 字段查询获得。

# blockid

block id,行所在数据块在对应文件中的块 ID。

# dir

dir,行在数据块上的槽位。

ROWID 使用规则



ROWID 可以作为伪列字段来使用,但必须被显式指定,即通过 SELECT *语句无法查询到 ROWID 的值。


ROWID 也可以作为字段的数据类型,用来存储 ROWID 类型数据,且支持对其进行增删改查等 DML 操作。


在 DML 操作中,YashanDB 支持 ROWID 与 UROWID/RAW/字符型的隐式数据类型转换。但将 ROWID 作为函数的参数,且与函数要求的参数数据类型不一致时,函数不会对其进行数据类型的隐式转换,而是提示错误返回。


对于 ROWID 类型数据的使用限制如下:


  • 不能作为分区键

  • 仅适用于 HEAP 表,分布式 HEAP 表不支持 ROWID。


对于 ROWID 伪列字段的使用限制如下:


  • 不能在包含 DISTINCT\GROUPBY\CONNECTBY\JOIN 算子、ROWNUM 伪列字段或聚合函数的子查询语句中使用 ROWID 伪列。


示例(HEAP 表)



SELECT ROWID,* FROM area WHERE area_no='01';ROWID AREA_NO AREA_NAME DHQ
1350:5:0:148:0 01 华东 Shanghai SELECT LENGTH(ROWID) FROM area WHERE area_no='01'; LENGTH(ROWID)
14 SELECT ISNULL(ROWID) FROM area WHERE area_no='01';[1:7]YAS-04401 data type STRING expected, but ROWID got
SELECT ROWID FROM (SELECT area_no FROM area GROUP BY area_no);YAS-04827 cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.
CREATE TABLE ROWID_BASE(ID INT);
BEGINFOR I IN 1..10 LOOP INSERT INTO ROWID_BASE VALUES(I);END LOOP;COMMIT;END;/
CREATE TABLE ROWID_TEST(C1 ROWID);INSERT INTO ROWID_TEST SELECT ROWID FROM ROWID_BASE;

INSERT INTO ROWID_TEST VALUES ('1350:5:0:148:0');
复制代码


UROWID 使用规则



YashanDB 内部将 UROWID 等同于RAW类型,因此 UROWID 使用规则与 RAW 使用规则完全一致。


示例(HEAP 表)



CREATE TABLE UROWID_TABLE(C1 UROWID);INSERT INTO UROWID_TABLE SELECT ROWID FROM ROWID_TEST;

INSERT INTO UROWID_TABLE VALUES ('1234ABCD');
INSERT INTO ROWID_TEST SELECT c1 FROM UROWID_TABLEWHERE c1 = '1234ABCD';YAS-00008 type convert error : invalid ROWID
SELECT ISNULL(c1) FROM UROWID_TABLEWHERE c1='0171070000000000000061000009000500' AND ROWNUM=1;ISNULL(C1)
false
复制代码


发布于: 刚刚阅读数: 2
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB ROWID UROWID类型_数据库_YashanDB_InfoQ写作社区