KES核心伪列深度解析:OID与ROWID机制、差异及实践

news2026/4/13 14:52:14
目录一、引言二、KES 中 OID 对象标识符机制详解2.1 OID 基本定义与核心定位2.2 系统表 OID全局唯一、跨对象连续分配2.3 普通表 OID局部独立、表内自增KES 核心差异2.4 OID 别名 regclass简化元数据查询效率2.5 OID 使用约束与最佳实践三、KES 独有 ROWID 机制逻辑行唯一标识与 Oracle 兼容实现3.1 ROWID 核心定位与设计目标3.2 ROWID 核心特性3.3 ROWID 三种启用方式方式 1全局 GUC 参数default_with_rowid方式 2建表显式指定WITH ROWID方式 3已有表添加 ROWID3.4 ROWID 数据类型深度解析3.5 ROWID 使用规范与限制四、核心存储机制对比OID vs ROWID vs 自增主键五、元数据访问与系统表解析六、兼容性与 GUC 参数冲突治理七、附录类型转换符::与 CAST 用法八、总结正文开始——一、引言在数据库存储引擎中行标识符是实现数据定位、元数据管理、事务并发、索引扫描的基础能力。KingbaseES 作为深度兼容 Oracle 国产企业级数据库对行标识体系做了针对性增强与重构一方面保留并优化了 OID 对象标识符用于系统表与数据库对象管理另一方面自研实现了 ROWID 逻辑唯一标识用于满足 Oracle 生态迁移、高速行访问、批量数据处理等场景。KES 对 OID 做了全局 / 局部双重特性区分对 ROWID 做了独立数据类型、自动索引、单调递增、GUC 参数管控的完整设计。两者不可同时生效通过参数优先级实现互斥控制形成了一套兼顾系统稳定性、生态兼容性、业务易用性的行标识体系。本文将从 OID 核心机制、ROWID 专属能力、存储选型对比、元数据访问、参数治理五大维度展开完整说明。二、KES 中 OID 对象标识符机制详解2.1 OID 基本定义与核心定位OID 全称Object Identifier对象标识符是 KES 内部用于唯一标识数据库对象的 4 字节无符号整数伪列。它是数据库内核识别表、视图、序列、函数、数据类型、索引等对象的核心依据也是绝大多数系统表的默认主键。OID 具备以下基础特征伪列属性OID 属于系统隐藏字段使用\d命令无法查看普通表默认不生成。生成规则仅在建表指定WITH OIDS或 GUC 参数default_with_oidstrue时才会自动生成。长度限制固定 4 字节最大值约 42.9 亿计数器溢出后会循环复用存在重复风险。双重特性系统表 OID 全局唯一分配普通表 OID 表内局部自增这是 KES 区别于 PostgreSQL 的关键设计。在 KES 中OID 的核心定位是内核元数据管理而非业务数据的唯一标识因此不建议在业务表中作为主键使用。本文验证KingbaseES版本-- 查看当前数据库版本 SELECT VERSION();2.2 系统表 OID全局唯一、跨对象连续分配KES 系统表如sys_class、sys_type、sys_proc、sys_attribute的 OID 由数据库全局计数器统一分配跨表、跨对象保持连续与唯一性不会出现表内独立编号的情况。我们可以通过以下 SQL 验证系统表 OID 的全局特性-- 查看系统表sys_type的总数据量 SELECT COUNT(*) FROM sys_type; -- 查看OID大于1208的记录数量 SELECT COUNT(*) FROM sys_type WHERE oid 1208; -- 查看大编号段OID分布 SELECT oid FROM sys_type WHERE oid 33990;从查询结果可以看出系统表 OID 并非从 1 开始连续分配而是全局统一递增不同对象共享同一计数器。进一步验证创建新对象时OID 在不同系统表间保持连续-- 创建自定义组合类型查看sys_type中的OID CREATE TYPE aatyp IS TABLE OF INT; SELECT oid, typname FROM sys_type WHERE typname aatyp; -- 创建自定义函数查看sys_proc中的OID CREATE OR REPLACE FUNCTION func_test05(i INT) RETURN INT AS DECLARE vv INT; BEGIN RETURN 1; END; / SELECT oid, proname FROM sys_proc WHERE proname func_test05;上述测试中类型与函数的 OID 连续递增证明 OID 是数据库级全局资源。2.3 普通表 OID局部独立、表内自增KES 核心差异KES 为了提升稳定性、降低计数器冲突风险将普通表 OID 设计为表内局部独立自增从根源避免业务表大量插入导致系统 OID 快速耗尽。普通表 OID 默认不生成可通过两种方式启用会话级设置default_with_oidstrue建表语句显式指定WITH OIDS。验证测试如下-- 1. 默认创建表无OID字段 CREATE TABLE tt5(id INT); INSERT INTO tt5 VALUES(10); SELECT oid, id FROM tt5; -- 报错oid字段不存在-- 2. 开启参数后创建表自动携带隐藏OID SET default_with_oids TO true; CREATE TABLE tt6(id INT); INSERT INTO tt6 VALUES(10); SELECT oid FROM tt6; -- 返回1表内自增 SELECT * FROM tt6; -- 隐藏列默认不展示-- 3. 关闭参数显式指定WITH OIDS建表 SET default_with_oids TO false; CREATE TABLE tt7(id INT) WITH OIDS; INSERT INTO tt7 VALUES(10); SELECT oid, id FROM tt7; -- 返回1表内自增测试表明KES 普通表 OID 从 1 开始、表内独立递增与系统表全局 OID 完全隔离这是 KES 在存储引擎层的重要优化。2.4 OID 别名 regclass简化元数据查询效率在 KES 中regclass是 OID 的专属别名类型专门用于表、索引、视图等对象的 OID 快速转换可将表名字符串直接隐式转换为对应 OID大幅简化系统表关联查询。sys_class系统表存储所有表 / 索引 / TOAST 表的 OID 与名称是 regclass 的核心依赖-- 查询以t开头的表对象及其OID SELECT oid, relname FROM sys_class WHERE relname LIKE t%; -- OID反向解析表名 SELECT 16700::regclass; -- 传统方式关联查询表字段信息 SELECT attrelid, attname, atttypid, attlen, attnum, attnotnull FROM sys_attribute WHERE attrelid (SELECT oid FROM sys_class WHERE relname teachers); -- regclass简化写法无需子查询直接转换 SELECT attrelid, attname, atttypid, attlen, attnum, attnotnull FROM sys_attribute WHERE attrelid teachers::regclass;regclass本质等价于SELECT oid FROM sys_class WHERE relname?是 KES 内核提供的语法糖广泛用于元数据监控、运维脚本、系统视图开发。2.5 OID 使用约束与最佳实践OID 为 4 字节整型计数器达到 42.9 亿后会循环无法保证全局永久唯一。单表可通过唯一索引避免 OID 重复但大数据量下会严重降低插入性能。业务表唯一标识优先使用SERIAL或BIGSERIAL超大规模表推荐BIGSERIAL。OID 仅用于内核系统表、元数据访问、数据库内部对象管理。三、KES 独有 ROWID 机制逻辑行唯一标识与 Oracle 兼容实现3.1 ROWID 核心定位与设计目标ROWID 是 KES自研增强的伪列机制主要面向 Oracle 兼容迁移、高速数据行定位、批量 DML 优化、日志解析等场景。与 OID 不同ROWID 并非物理地址而是逻辑唯一标识具备全局唯一性、单调递增、自动索引、可比较、可查询等完整能力。KES ROWID 设计目标提供与 Oracle 语法一致的 ROWID 使用方式降低迁移成本保证行记录全局唯一、长期稳定、不随 VACUUM / 修改而变化自动创建唯一 BTREE 索引提升等值查询与范围查询性能通过 GUC 参数统一管控支持全局开启与表级指定与 OID 互斥避免伪列冲突与存储冗余。3.2 ROWID 核心特性隐藏伪列默认不展示可显式查询不支持 INSERT/UPDATE/DELETE全局唯一基于事务回卷次数、事务 XID、事务内序号复合生成单调递增后插入行的 ROWID 一定大于先插入行自动索引创建时自动生成唯一约束 BTREE 索引编码格式23 位 64 进制字符串A-Z、a-z、0-9、、/存储长度变长存储占用 4~18 字节参数互斥与 OID 不可同时生效ROWID 优先级更高。3.3 ROWID 三种启用方式方式 1全局 GUC 参数default_with_rowid开启后所有新建表自动携带 ROWID 隐藏列default_with_oids自动失效-- 查看参数状态 SHOW default_with_oids; SHOW default_with_rowid; -- 同时为true时ROWID生效、OID失效 CREATE TABLE tt11(id INT); INSERT INTO tt11 VALUES(10); SELECT rowid, id FROM tt11; -- 可查询 SELECT oid, id FROM tt11; -- 报错不存在方式 2建表显式指定WITH ROWID表级启用灵活控制不影响全局CREATE TABLE student( sno INT, name VARCHAR(10), birthday DATE, department VARCHAR(10), sex VARCHAR(10) ) WITH ROWID; -- 插入测试数据 INSERT INTO student VALUES(1, li, 2018-01-01, physics, boy); INSERT INTO student VALUES(5, lu, 2018-01-02, chinese, boy); INSERT INTO student VALUES(3, wang, 2018-01-03, english, girl); INSERT INTO student VALUES(4, zhang, 2018-01-04, history, boy); INSERT INTO student VALUES(2, jack, 2018-01-05, history, boy); -- 查询ROWID SELECT rowid, * FROM student; -- 查看自动生成的唯一索引 \d student;方式 3已有表添加 ROWIDALTER TABLE 表名 SET WITH ROWID;3.4 ROWID 数据类型深度解析ROWID 是 KES 内置独立数据类型具备严格的格式约束显示长度固定 23 位 64 进制字符串内部结构32 位事务回卷次数 32 位事务 XID 64 位事务内序号合法范围最小AAAAAAAAAAA最大P//////////比较规则先比较回卷次数 → 事务 XID → 事务内序号支持运算符、、、、、!不支持算术运算。类型验证与非法输入测试-- 创建ROWID类型表 CREATE TABLE rowid_tt1(id ROWID); -- 合法ROWID导入导出 COPY rowid_tt1 FROM /tmp/rowid_tt1.txt; SELECT * FROM rowid_tt1; COPY rowid_tt1 TO /tmp/rowid_tt1_to.txt; -- 非法长度报错 INSERT INTO rowid_tt1 VALUES(AAAAAAAAAAABAAAAAAAAAAA4444); INSERT INTO rowid_tt1 VALUES(AAAAAAAAAAABAAAAA); -- 比较查询 SELECT * FROM rowid_tt1 WHERE id AAAAAAAAAAABAAAAAAAAAAB;3.5 ROWID 使用规范与限制支持在 SELECT 投影列、WHERE 条件、ORDER BY、GROUP BY 中使用支持存储过程、函数、动态 SQL 中使用支持 BTREE、HASH 索引不可参与算术运算、字符串拼接、函数运算不可手动更新、插入、删除全局参数与表级指定冲突时以表级为准。四、核心存储机制对比OID vs ROWID vs 自增主键在 KES 实际开发中OID、ROWID、SERIAL/BIGSERIAL 自增主键是最常见的三种行标识方案三者定位、能力、性能、适用场景差异显著以下是全面对比对比维度OIDROWIDSERIAL/BIGSERIAL类型系统隐藏伪列系统隐藏伪列显式业务列唯一性系统表全局 / 普通表局部全库逻辑唯一表内唯一自动索引无需手动创建自动唯一 BTREE 索引需手动建主键 / 索引长度固定 4 字节变长 4~18 字节4/8 字节上限42.9 亿可循环几乎无上限BIGSERIAL 近无限优先级低于 ROWID高于 OID业务最高生态兼容PostgreSQL 原生Oracle 高度兼容通用标准性能开销极低低带索引低适用场景系统表、元数据、内核对象Oracle 迁移、高速行定位、批量 DML业务主键、表关联、分布式事务选型结论内核运维、元数据访问 → 使用 OIDOracle 迁移、快速行定位、兼容改造 → 使用 ROWID业务系统、表关联、外键、持久主键 → 使用 BIGSERIAL。五、元数据访问与系统表解析KES 的 OID 与 ROWID 均依赖系统表实现管理与查询掌握系统表结构可大幅提升 DBA 运维效率sys_class所有表、索引、视图、序列的 OID 与基础信息sys_type数据类型、自定义类型的 OID 管理sys_proc函数、存储过程的 OID 管理sys_attribute表字段、系统隐藏字段tableoid、ctid、xmin 等sys_database数据库对象 OIDsys_namespace模式SchemaOID。结合 regclass 可实现高效元数据查询-- 查询表的全部字段含系统隐藏列 SELECT * FROM sys_attribute WHERE attrelid teachers::regclass;六、兼容性与 GUC 参数冲突治理OID 与 ROWID 的 GUC 参数存在严格互斥规则是 KES 稳定运行的关键保障互斥规则default_with_oids与default_with_rowid不可同时生效优先级ROWID 参数优先级高于 OID冲突报错OID 开启、ROWID 关闭时执行WITH ROWID建表直接报错生效范围全局参数影响后续新建表表级指定仅作用于当前表。冲突场景验证SET default_with_rowid TO false; SET default_with_oids TO true; CREATE TABLE tt16(id INT) WITH ROWID; -- 报错无法创建参数最佳实践新业务系统全局开启 ROWID关闭 OIDOracle 迁移项目强制使用 ROWID禁用 OID混合环境使用表级指定避免全局冲突。七、附录类型转换符::与 CAST 用法::是 KES 中的强制类型转换符等价于标准 SQL 的CAST广泛用于 OID、regclass、ROWID 等类型转换-- :: 简写方式 SELECT 25::INTEGER, 12-oct-2023::DATE, sys_typeof(25::INTEGER); -- CAST标准方式 SELECT CAST(25 AS INTEGER), CAST(12-oct-2023 AS DATE);八、总结KingbaseES 中的 OID 与 ROWID 构成了一套分层、互补、互斥的行标识体系。OID 专注于系统表与元数据管理采用全局 局部双重分配策略保证内核稳定ROWID 作为 KES 独有增强能力提供逻辑唯一、单调递增、自动索引、Oracle 兼容的行定位能力完美支撑企业级迁移与高性能场景。在实际工程应用中必须明确三者边界OID 用于系统、ROWID 用于兼容、自增主键用于业务并通过 GUC 参数合理管控避免冲突。理解 OID 与 ROWID 的底层实现、特性差异与使用规范能够帮助开发者与 DBA 更好地利用 KES 内核能力提升系统设计合理性、查询性能与迁移效率。作为国产企业级数据库KES 通过对 OID 的优化与 ROWID 的自研实现满足了政企核心系统对兼容性、稳定性、高性能的刚性需求是关键行业核心业务系统的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2513373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…