论Oracle兼容性,我们需要做什么
作者介绍:王海峰,数据库系统架构师,YashanDB SQL开发负责人,10年以上数据库内核技术开发经验。
Oracle兼容性是目前国产数据库的关键任务之一,其直接影响到商业迁移的成本和竞争力。
我们经常发现,部分国产数据库声称与 Oracle兼容性高达90%,但在实际迁移过程中,仍需要频繁地修改业务应用的代码。为何实现与Oracle高兼容度的数据库产品如此困难?其中一个重要原因是Oracle兼容性不仅是模仿,而是一个非常复杂和工程量庞大的逆向工程。其技术实现的复杂性以及多如牛毛的细节,足以让多数“年轻”的数据库团队望洋兴叹。
强可扩展性的自主SQL引擎
SQL的本质在于理解用户编写SQL语句的意图,将其转成高效执行计划,然后操作和管理数据库执行要求的算子,返回对应结果集。其过程需要实现编译、优化、执行3步曲。

图 1 SQL 3步曲
对于YashanDB的SQL引擎来说,为了快速实现Oracle兼容性,从架构实现上采取了有效的方法:通过对SQL语法、函数、数据类型、存储过程语法、高级包、优化规则、执行算子等各个维度进行抽象和归纳,在SQL引擎的各个功能阶段提供功能注册点。由于全链路的代码都是自主研发,我们可以在框架内通过扩展功能注册点来快速添加各种兼容性功能,对于部分涉及调整框架的需求,也能够确保整个架构的稳定性。
解析器(LAXER/PARSER):YashanDB全新实现了词法解析器和语法解释器,通过对注册关键字的定界,精准地生成符合查询语义的抽象语法树。语法树以高效的表达式符号作为基本组成单元,为后续环节提供输入。不同于其他数据库,YashanDB没有采用开源组件进行抽象语法树的编译,主要从语法支持的灵活度、语法编译生成语法树的高效性以及开发者开发和调试的易用性等角度考虑。
优化器(OPTIMIZER):YashanDB的SQL引擎为了达到极致性能,同时支持了行列两类算子分别满足低时延短事务和大数据查询场景的差异化需求。在优化器方面,我们面临着一个更具挑战性的任务:需要实现面向差异化代价模型的行列混合评估、行列统一的并行优化框架以及面向特定模型的动态优化规则。由于没有现成的道路可走,我们选择自主研发,为YashanDB打造一款适合高速查询优化的优化器。
高效的执行引擎(EXECUTOR):YashanDB同时涵盖了低时延段事务的TP场景和海量数据查询的AP场景,所以火山、向量化、并行化的执行引擎技术应运而生。
Oracle已经建立了一套成熟且卓越的技术体系,要想做到完全兼容,不仅需要投入大量的人力、物力和时间,还需要深入理解其内部运作原理和实现细节。以Oracle 19c为例,在SQL层主要功能罗列如下:
- 语法和常见功能函数;
- 结构化数据类型;
- JSON、XML等半结构化数据及功能;
- 查询加速提升,如OLAP、并行处理、结果集缓存等;
- 如UDT、高级包、存储过程、触发器等各种高级特性;
- 安全、加密和审计;
- 工具生态上大量的衍生工具和中间件等。
数据库是一个极其复杂的软件工程产品,不能简单地视为一个无需调整即可直接复用的通用组件。时至今日,SQL标准仍在不断发展,ISO/IEC 9075:2023等新标准不断涌现。对于国产数据库厂商而言,在Oracle兼容方面需保持务实的态度,将重点放在核心功能的实现上,对其保持高度的兼容性与稳定性。正是因为自主研发打造的SQL引擎,我们不仅能够在Oracle兼容性方面持续追求全面兼容的目标,更重要的是可以将我们的创新理论更好地融入到SQL架构中,将有界计算、向量化、多模等技术天然融合、持续演进。
YashanDB从设计之初,就定下Oracle全面兼容的目标。目前已从四个层面实现了高度的Oracle兼容性:
- 语法兼容层面:目前主流的DQL、DML、HINT语法、PL/SQL语法已全面兼容;
- 语义兼容层面:SQL语义保持一致,包含语法对应的语义实现、对象管理和事务处理等;
- 高级特性兼容层面:1)PL/SQL对象如存储过程、UDF、UDP、触发器、JOB等全面兼容;2)JSON、GIS等新型数据类型功能兼容,提供等价替换方案;3)安全、加密和审计全面兼容;4)查询加速提升能力同步构建;
- 生态兼容层面:提供AWR/RMAN/开发者工具等能力。

下面将以语法兼容层面的数据类型、SQL语法功能、部分高级特性角度,详细阐述YashanDB在Oracle兼容性上面临的挑战和应对的开发原则。
数据类型
数据类型兼容方面,YashanDB与Oracle高度兼容,其功能表现差异很小,主要包含数值类型组、字符串类型组、时间类型组和其他类型:
数值类型组:Oracle几乎所有数值类型均使用NUMBER来实现,为了应对这一挑战,YashanDB实现了一个极其高效的NUMBER类型,用户在Oracle数据库上定义的数值类型可以无缝迁移到YashanDB。此外,为了进一步提高存取和计算效率,YashanDB增加了各种C语言原生类型,如TINYINT、BIGINT、FLOAT、DOUBLE等,在表字段设计上可以提供更多灵活的选择,如果原生类型可以满足用户的表字段设计,那么建议调整为原生类型;
字符串类型组:精心打造CHAR、VARCHAR、NCHAR、NVARCHAR等各类字符串类型,追求细节层面的功能表现。在字符串类型规格、运算能力、隐式转换能力、空串表达以及字符集支持等各方面均做到易用、易理解、易维护的较高水准。YashanDB始终坚持既定的功能设计原则,以易于接受和理解的方式设计产品的功能表现。
图 4 不同字符集的技术挑战
时间类型组:当前YashanDB提供了DATE、TIMESTAMP、YM-INTERVAL、DS-INTERVAL等类型用于满足迁移和设计要求。在该特性开发上,面临的技术挑战主要是时间类型的格式符处理非常灵活和不同场景下时间类型的优化选择;
二进制数据和大对象数据:随着信息系统的发展,对二进制数据和大对象数据的需求也日益增长,YashanDB在二进制类型、CLOB/BLOB/NCLOB等大对象类型做了大力的开发。在这些数据类型上,针对性地开发了查询加速结构、函数运算和空间管理等特性,以提升对象存取和运算效率。

此外,在数据库预置的数据类型基础上,提供了UDT自定义类型便于用户灵活的指定和扩展。YashanDB的UDT可以用于PL/SQL语言中,也可以直接作为表的列字段类型形成嵌套表。

SQL语法能力和内置功能
SQL语法功能实现上, YashanDB的DML/DQL已经包括运算符、FILTER、内连接、外连接、半连接、反半连接、分组、聚合、排序、集合、层次查询、子查询等能力,用户在Oracle上实现的SQL语句,几乎可以不用调整直接在YashanDB上运行。 我们严格遵循语法语义要求,在语义获取上不断地比对Oracle、DB2、PostgreSQL、MySQL等数据库的功能表现,以确保生成严谨的、经得起推敲的产品。同时内部通过混沌测试工程,不断构造非法或者复杂的SQL语句进行测试。
高级特性
数据库的高级特性往往涉及到较高的技术挑战,如UDF(用户自定义函数)、JAVA UDF、C UDF、存储过程、高级包、UDT、触发器、JOB、DBLINK等。我们在借鉴Oracle已有实现能力基础上,追寻技术上的自主独立,寻求符合YashanDB技术架构落地的方案,从功能特性的细节角度,提炼并遵循了一系列的实现原则。
JAVA UDF方案:Oracle为了实现这一特性,直接将JVM集成到内核中;由于Oracle采用多进程架构,一旦用户编写的UDF存在异常,影响范围有限,可以重新启动进程。然而,由于YashanDB采用多线程架构,一旦用户要运行的代码出现异常,对我们来说是毁灭性的冲击。所以,我们需要设计一个沙箱进程,由该进程负责拉起JVM执行用户UDF。虽然这种架构会需要如协议交互和进程管理的额外工作,但对于实现技术路线的自主性和独立性是必要的。
PL/SQL语言的功能:这是Oracle绑定很多用户应用的锁链,为了降低用户应用迁移成本,YashanDB实现了大部分的PL/SQL语句,如声明、赋值、控制、跳转、循环、游标处理、SQL语句、动态SQL以及异常处理等。同时提供了全面的过程体对象,如存储过程、UDP、UDT、触发器等供用户使用。以UDT 自定义类型为例,YashanDB提供了RECORD、OBJECT、VARRAY、NESTED TABLE多种形态,支持方法的声明、支持将嵌套表形态。近期在某基金的核心交易处理系统中,完美地解决NESTED TABLE变量参与BULK导入的业务移植功能。随着应用场景的不断丰富和复杂化,存储过程的功能也将不断完善和优化。
DBLINK功能:YashanDB提供了从YashanDB到YashanDB,YashanDB到Oracle,Oracle到YashanDB的远端访问和事务能力,在这个功能点上,存在很多技术细节需要攻克,如异构数据库间数据类型、字符集的映射,计划和表达式如何进行远端下推,复杂SQL的拆分,远端事务管理,复杂DML语句联动等。

- 特性对标。寻求适合我们技术架构的落地方案;
- 提炼实现原则。从功能特性角度,摸清实现细节,从细节中提炼特性的实现原则;
- 兼容不是抄袭、不能盲从。甄别Oracle的特性规格和特性实现BUG;在YashanDB开发过程不断汇总实现细节上的典型案例,同时编写开发指导文档提供用户避免踩坑;
- 预留扩展路线,为后续技术竞争力落地做好铺垫。
相关文章:

论Oracle兼容性,我们需要做什么
作者介绍:王海峰,数据库系统架构师,YashanDB SQL开发负责人,10年以上数据库内核技术开发经验。 Oracle兼容性是目前国产数据库的关键任务之一,其直接影响到商业迁移的成本和竞争力。 我们经常发现,部分国产…...

你知道多号发圈的同时并延迟评论的方式吗?
你知道多号发圈的同时并延迟评论的方式吗? 其实很简单。 步骤1:编辑好朋友圈内容 步骤2:设置延迟评论 步骤3:选择多个号发圈 通过以上3个步骤,就可以实现多号发圈的同时并延迟评论。 在发布朋友圈前,只需要…...

【BugBounty】记一次XSS绕过
前言 最近一直在看国外的赏金平台,绕waf是真的难受, 记录一下绕过的场景。 初步测试 一开始尝试XSS,发现用户的输入在title中展示,那么一般来说就是看能否闭合,我们从下面图中可以看到,输入尖括号后被转成了实体。 …...
Linux文件目录结构详解:根目录和常见子目录介绍
文章目录 引言1. 什么是Linux文件目录结构2. Linux文件系统的重要性 根目录(/)2.1 根目录的作用和特点2.2 根目录下常见目录的介绍 /bin 目录3.1 /bin 目录的作用和内容3.2 常见的可执行命令示例 /etc 目录4.1 /etc 目录的作用和内容4.2 配置文件的存放位…...

知识付费小程序的推广与用户增长策略
在知识付费小程序开发完成后,推广和用户增长是关键的成功因素。本文将探讨一些推广策略和用户增长方法,并提供代码示例,帮助您在知识付费小程序中实施这些策略。 1. 社交媒体分享功能 在知识付费小程序中添加社交媒体分享功能,…...

微信小程序 获取当前屏幕的可见高宽度
很多时候我们做一下逻辑 需要用整个窗口的高度或宽度参与计算 而且很多时候我们js中拿到的单位都是px像素点 没办法和rpx同流合污 官方提供了wx.getSystemInfoSync() 可以获取到部分窗口信息 其中就包括了整个窗口的宽度和高度 wx.getSystemInfoSync().windowHeight 返回值为像…...

使用 Splashtop 驾驭未来媒体和娱乐
在当今时代,数字转型不再是可选项,而是必选项。如今,媒体与娱乐业处于关键时刻,正在错综复杂的创意、技术和远程协作迷宫之中摸索前进。过去几年发生的全球事件影响了我们的日常生活,不可逆转地改变了行业的运作方式&a…...

Tomcat项目启动报错
java.io.IOException: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerInitializer to javax.servlet.ServletContainerInitializer解决办法:可能Tomcat版本不对,使用7.0.90版本启动报错,使用8.0…...

offer
【录用通知书】 如何判断公司的好坏呢。 注意了,我们软件行业,技术管理类,技术类,产品类 好公司好企业基本都会给你说清楚,一项多少钱,加班多少钱,这样的 像这类公司的薪资结构复杂就要特别…...

漏洞复现--鸿运主动安全监控云平台任意文件下载
免责声明: **文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何…...

第二章 物理层 | 计算机网络(谢希仁 第八版)
文章目录 第二章 物理层2.1 物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和统计时分复…...

路由高级特性
项目拓扑与项目需求 项目需求 某企业网络使用ospf和isis作为IGP协议实现内部网络的互联互通,区域规划和IP规划如图所示,现在要求实现如下需求: LSW1和AR1使用vlan10互联,与AR2使用vlan20互联,LSW1与LSW2、3、4之间使…...

【MySQL】数据库排查慢查询、死锁进程排查、预防以及解决方法
MySQL数据库排查慢查询、死锁进程及解决方法 一、排查慢查询 1.1检查慢查询日志是否开启 1.1.1使用命令检查是否开启慢查询日志: SHOW VARIABLES LIKE slow_query_log;如果是 Value 为 off 则并未开启 1.1.2开启并且查看慢查询日志: MySQL提供了慢查询日志功能,可以记录所…...

WSL2下的Docker配置和使用
在Windows的Linux子系统(Windows Subsystem for Linux)WSL2中安装、配置和使用 Docker,可以参考官方教程:WSL上的Docker远程容器入门. 重要步骤总结如下: 先决条件 确保你的计算机运行的是 Windows 10(更…...

污水管网水位监测,管网水位监测仪守护城市污水管网运行
万宾科技:污水管网水位监测 近年来,城市化进程的加速使得污水管网建设愈发重要。然而,在管网运维中,水位监测一直以来都是一个令人头痛的难题。为了解决这一问题,万宾科技公司推出了管网水位监测仪EN200-D2࿰…...

IDEA插件版本升级和兼容新版本idea
1.关于IDEA插件的版本设置问题 打开jetbrains插件市场,随意打开一个插件详情页面的Versions菜单,我们可以看见一个插件包不同时期发布的不同版本(Versions),并且每个版本包含了可兼容IDEA或PyCharm的版本范围…...

Docker 容器应急
容器网络简单理解 容器拥有n多张veth网卡与一张docker0网卡 docker 五种网络 bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。host 容器不会获得一个独立的network namespace,而是与宿主机共用一个…...

webservice接口自动化测试
1,用soupui进行测试 2,安装soupUI 3,测试的时候是给了一个wdsl 操作步诹:new (name , 填写地址)---导入wsdl文件---看到所有的接口 发送请求的格式<xml> canshu</xml> 应用场景,…...

精益生产与MES生产管理系统相互融合
近年来,精益生产理念在企业管理中越来越受欢迎。它强调以最小的浪费,在最短的时间内,生产出高质量的产品。这一理念的实施手段包括准时制生产方式、适时生产方式等,消除浪费、看板、快换工装等都是精益提高的工具方针。 然而&…...

(c语言进阶)指针的进阶
一.字符指针 1.一般应用 (1)%c的应用 (2)%s的应用 字符指针没有权限通过解引用去改变指针指向的值 2.笔试题 题目:判断输出结果 int main() { const char* p1 "abcdef"; const char* p2 "…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...