当前位置: 首页 > news >正文

论Oracle兼容性,我们需要做什么

作者介绍:王海峰,数据库系统架构师,YashanDB SQL开发负责人,10年以上数据库内核技术开发经验。


Oracle兼容性是目前国产数据库的关键任务之一,其直接影响到商业迁移的成本和竞争力。

我们经常发现,部分国产数据库声称与 Oracle兼容性高达90%,但在实际迁移过程中,仍需要频繁地修改业务应用的代码。为何实现与Oracle高兼容度的数据库产品如此困难?其中一个重要原因是Oracle兼容性不仅是模仿,而是一个非常复杂和工程量庞大的逆向工程。其技术实现的复杂性以及多如牛毛的细节,足以让多数“年轻”的数据库团队望洋兴叹。

YashanDB作为一款从核心理论到关键系统均为原创的数据库产品,从构建初期就具备了技术优势,在Oracle兼容性实现上,敢于亮剑并充分发挥工匠精神,不断打磨,努力构筑一个真正形神兼备的数据库产品。以下将从YashanDB SQL引擎技术、Oracle兼容性的开发原则等方面,阐述YashanDB如何解决Oracle兼容性的开发难题以及如何实现与Oracle的原生兼容。

强可扩展性的自主SQL引擎


SQL的本质在于理解用户编写SQL语句的意图,将其转成高效执行计划,然后操作和管理数据库执行要求的算子,返回对应结果集。其过程需要实现编译、优化、执行3步曲。


0794f74fd6b9cf0cdc930ccbaf3589eb.jpeg

图 1 SQL 3步曲

对于YashanDB的SQL引擎来说,为了快速实现Oracle兼容性,从架构实现上采取了有效的方法:通过对SQL语法、函数、数据类型、存储过程语法、高级包、优化规则、执行算子等各个维度进行抽象和归纳,在SQL引擎的各个功能阶段提供功能注册点。由于全链路的代码都是自主研发,我们可以在框架内通过扩展功能注册点来快速添加各种兼容性功能,对于部分涉及调整框架的需求,也能够确保整个架构的稳定性。

ae713579811e44fe2f31bb5f3532fd5f.jpeg

图2 YashanDB 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/开发者工具等能力。
889be76d8c0781e6be45220d0bdcd7b0.jpeg 图3 Oracle四层生态兼容

Oracle兼容性的开发原则

下面将以语法兼容层面的数据类型、SQL语法功能、部分高级特性角度,详细阐述YashanDB在Oracle兼容性上面临的挑战和应对的开发原则。


数据类型

数据类型兼容方面,YashanDB与Oracle高度兼容,其功能表现差异很小,主要包含数值类型组、字符串类型组、时间类型组和其他类型:

  • 数值类型组:Oracle几乎所有数值类型均使用NUMBER来实现,为了应对这一挑战,YashanDB实现了一个极其高效的NUMBER类型,用户在Oracle数据库上定义的数值类型可以无缝迁移到YashanDB。此外,为了进一步提高存取和计算效率,YashanDB增加了各种C语言原生类型,如TINYINT、BIGINT、FLOAT、DOUBLE等,在表字段设计上可以提供更多灵活的选择,如果原生类型可以满足用户的表字段设计,那么建议调整为原生类型;

  • 字符串类型组:精心打造CHAR、VARCHAR、NCHAR、NVARCHAR等各类字符串类型,追求细节层面的功能表现。在字符串类型规格、运算能力、隐式转换能力、空串表达以及字符集支持等各方面均做到易用、易理解、易维护的较高水准。YashanDB始终坚持既定的功能设计原则,以易于接受和理解的方式设计产品的功能表现。

实例1:Oracle的VARCHAR类型必须通过配置字符串的EXTEND模式才可以将VARCHAR扩展到32K,否则规格只有4K;YashanDB的VARCHAR类型直接支持提供最大规格;
实例2:空串和NULL的等价处理上,Oracle的主体规则是空串视为NULL,但在少量表达式处理上,存在一些细节上的差异,这个差异有可能是历史兼容或者BUG导致的;YashanDB目前坚持空串按NULL处理;
实例3:关注字符串类型转换时由于字符集不同带来的技术挑战。

bf2a773701b903ee56ab7e1f3419a108.jpeg


图 4 不同字符集的技术挑战
  • 时间类型组:当前YashanDB提供了DATE、TIMESTAMP、YM-INTERVAL、DS-INTERVAL等类型用于满足迁移和设计要求。在该特性开发上,面临的技术挑战主要是时间类型的格式符处理非常灵活和不同场景下时间类型的优化选择;

  • 二进制数据和大对象数据:随着信息系统的发展,对二进制数据和大对象数据的需求也日益增长,YashanDB在二进制类型、CLOB/BLOB/NCLOB等大对象类型做了大力的开发。在这些数据类型上,针对性地开发了查询加速结构、函数运算和空间管理等特性,以提升对象存取和运算效率。

124a49034a8b5978aa992faaa241dd52.jpeg 图 5 LOB类型的技术细节


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

e8bc20c7f0c9326f2bbdf11e3ee61f1c.jpeg 图 6 UDT类型的技术挑战


SQL语法能力和内置功能


Oracle兼容性的主体部分是最广为人知的SQL语法能力和内置功能。以Oracle 12C为例,SQL语句主要是以SQL:2011核心,YashanDB已基本实现了这个层级的SQL语法语义兼容。

SQL语法功能实现上, YashanDB的DML/DQL已经包括运算符、FILTER、内连接、外连接、半连接、反半连接、分组、聚合、排序、集合、层次查询、子查询等能力,用户在Oracle上实现的SQL语句,几乎可以不用调整直接在YashanDB上运行。 我们严格遵循语法语义要求,在语义获取上不断地比对Oracle、DB2、PostgreSQL、MySQL等数据库的功能表现,以确保生成严谨的、经得起推敲的产品。同时内部通过混沌测试工程,不断构造非法或者复杂的SQL语句进行测试。

内置功能方面, 我们也在不断丰富和扩展,例如字符串函数、数学函数、时间函数、窗口函数等,这些都是出厂阶段数据库携带的内置功能特性,可以极大地扩展各数据类型的运算能力。在DDL层面,YashanDB已经实现普通表、分区表、临时表、全局索引、函数索引、系统视图、物化视图、序列和同义词等常见功能。


高级特性


数据库的高级特性往往涉及到较高的技术挑战,如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语句联动等。

5945b9cb84a56f3cdac0f4e877ecdaa1.jpeg 图 7 DBLINK

除了SQL功能角度,YashanDB还从以下方面完善Oracle兼容性要求,包含统计信息,收集基于列的统计和直方图信息;计划优化规则;常用字符集支持,UTF8、GBK、UTF16、18030等常见字符集支持;安全、审计与加密;导入导出工具支持;JDBC/ODBC驱动等。由于文章篇幅原因,将不一一展开讲解,敬请期待后续的系列技术文章。

写在最后

在过去的几十年时间里,Oracle数据库凭借出色的产品能力与硬核的技术实力始终处于领先地位,使得国内诸多关键行业的企业级应用深度依赖Oracle。

数据库和应用的不兼容,会导致用户需要付出极大的迁移成本,带来的直接后果就是难以形成规模化复制。面对业务的痛点与需求,YashanDB坚定选择Oracle的高度兼容性,以最大程度降低应用迁移的成本与风险,助力用户真正降本提质增效。 在实现Oracle兼容性的目标上,我们以这些方法努力探索:
  1. 特性对标。寻求适合我们技术架构的落地方案;
  2. 提炼实现原则。从功能特性角度,摸清实现细节,从细节中提炼特性的实现原则;
  3. 兼容不是抄袭、不能盲从。甄别Oracle的特性规格和特性实现BUG;在YashanDB开发过程不断汇总实现细节上的典型案例,同时编写开发指导文档提供用户避免踩坑;
  4. 预留扩展路线,为后续技术竞争力落地做好铺垫。
我们将始终以用户需求为导向,以技术创新为驱动力,在真实场景中反复打磨锤炼,持续完善兼容性能力,助力用户实现国产数据库平滑迁移。

相关文章:

论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&#xff0…...

IDEA插件版本升级和兼容新版本idea

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

Docker 容器应急

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

webservice接口自动化测试

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

精益生产与MES生产管理系统相互融合

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

(c语言进阶)指针的进阶

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

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...