三大兼容 | 人大金仓兼容+优化MySQL用户变量特性

news2024/11/15 20:51:03

98b96b7933b3019dbbecf1ab61856748.gif

目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使数据库的易用性得到了极大优化,下面来一探究竟吧!

什么是用户变量?

用户变量是用户自定义的保存单个特定类型数据值的临时对象,是为了适应在数据库使用时需要临时暂存值的场景而设计的,目的是提高数据库系统的易用性。

用户变量的应用场景十分广泛,以下是两个典型的使用场景:

(1) 用于暂存值,当某个数值需要出现在不同的查询中,或者是同一个查询内的不同位置时,可以先将该数值赋给用户变量,在查询中使用该数值的位置用用户变量替代。例如:

fa59b3a963f2fe676f854248c7a34acd.png

(2) 用于表达式递归计算,递归计算中需要用到变量的值,同时要将计算结果重新赋给变量,循环往复。比如投影列中需要标记结果集的行号时,可以写成如下语句:

812e9bb58aa47849457ad9a1cf151809.png

KingbaseES的GUC参数和局部变量的区别

KingbaseES的GUC参数是控制数据库系统运行时状态所必须的,因此它的数量,名字都是固定的,不允许用户自行添加和删除。部分GUC参数的值可以修改,通过SET语法设置,通过RESET或DISCARD语法重置。

在KingbaseES的PLSQL语言中允许使用局部变量,局部变量仅在PLSQL程序块内使用,可以随意命名、赋值。脱离了程序块以后,局部变量将变得不可见。程序块嵌套时,内层的局部变量将覆盖外层同名的局部变量。KingbaseES中,GUC参数、用户变量和局部变量的实现是互相分离的,因此其命名也没有冲突。

KingbaseES

用户变量特性

1

命名规则

用户变量命名以@为前缀,变量名包含字母(大小写不敏感),数字,中文字符以及“.”“_”,和“$”符号。如果用单引号引上,变量名可以是任意字符串,比如@’var-name’也是支持的。这点和MySQL一致。

2

存储类型

KingbaseES用户变量支持的存储类型有五种,分别为bool, int8(bigint), float8(double), numeric, char(string);默认的存储类型为char。其他类型的值存储为用户变量时会依据内部规则转换为以上五种类型。KingbaseES在存储类型上比MySQL多出一个bool类型。

3

使用方式

KingbaseES用户变量的使用比较灵活。在使用时不必事先声明,可以先赋值后引用,也可以直接引用。赋值时数据库会自动确定用户变量的存储类型,因此不必显式指定类型。KingbaseES允许对用户变量多次赋值,赋值时不限定类型(类型可变)。在未赋值条件下直接引用用户变量时,存储类型为char, 显示类型为text,值为null。这点和MySQL一致。

4

可见性

KingbaseES用户变量在连接内可见,连接外不可见,连接断开时用户变量自动释放。这点和MySQL一致。

5

用户变量的语法

KingbaseES完全兼容MySQL用户变量的SET赋值语法、SELECT INTO赋值语法、表达式赋值和取值语法。同时增加了KingbaseES特有的删除语法,用户可以通过“RESET @var_name;”删除单个用户变量,或者通过“DISCARD USER VARIABLES;”删除所有用户变量。

KingbaseES

兼容+优化MySQL用户变量特性

1

MySQL用户变量的使用问题

MySQL用户变量类型易变,单值存储,赋值和取值是表达式的一部分,可以出现在查询中的大多数地方,这样的特性或特性组合造成了MySQL用户变量的使用问题。第一类问题是由于类型的易变性引起的。第二个问题是MySQL手册中明确说明用户变量的计算顺序是不确定的。第三个问题是由于单值存储导致的。

因此,MySQL手册中也明确表示在使用过程中用户需自行保证带有用户变量查询的结果集的正确性。虽然用户变量的表达式赋值会带来许多的问题,但是由于表达式赋值在实际使用中非常普遍,我们实现了表达式赋值。

2

KingbaseES在表达式上对MySQL的改进

在KingbaseES中,对投影列中用户变量取值时类型的根据KingbaseES的语义解析顺序,离该取值最近的赋值类型确定为用户变量的数据类型。如果用户变量没有赋值,使用已存在用户变量类型;如果用户变量不存在,则取默认类型(字符串)。举例如下:

f886a0308fb52d5b90cc3f431fc9f2c6.png

在查询执行时,KingbaseES中用户变量的计算顺序也是确定的,即依据KingbaseES的语义解析顺序处理。

除此之外,KingbaseES对用户变量的优化和并行,并发进行了限制。

由于用户变量是单值存储,类型可变的,如果遇上并发,并行与用户变量赋值混合的情况,用户变量的值将变得不可预测。因此,在使用用户变量时,禁止查询并发,并行。KingbaseES在数据库内部对这两个特性进行了禁止,使用者无需做任何操作。

在执行包含用户变量的语句时,执行性能相比无用户变量的语句会有下降,这是正常的。为了保证结果集的正确性,包含用户变量的语句需要尽可能按输入语法的顺序执行。因此不能使用优化器进行优化,也不能并行执行其中的某些步骤。

3

KingbaseES用户变量表达式的使用注意事项

用户变量的类型是可变的,但是在SELECT查询中,需要确保列类型前后保持一致。如果在计算过程中用户变量类型发生了变化,结果集将会变得不可预期。因此,在使用用户变量时,用户需要自行保证结果集的正确性。比如,确保用户变量类型在计算过程中不发生变化,如果发生了变化,可以通过隐式转换转为预期类型等。

如果在单个 SELECT 语句中有多个用户变量赋值子句,KingbaseES会依据内部的解析顺序执行,不能完全保证表达式求值的顺序符合用户期望。KingbaseES尽可能使表达式按照KingbaseES语义顺序求值,但是由于优化器的影响,求值顺序可能无法完全保证。

为了保证用户变量类型在计算过程中保持不变,给用户变量赋值尽可能使用SET语法和SELECT INTO语法,避免使用表达式赋值语法(该语法主要为兼容MySQL历史用例而设计)。必须要使用表达式赋值时,尽可能将赋值用在投影列最外层,尽量少用在其他的位置,比如JOIN ON,HAVING, GROUP BY,ORDER BY子句中,在这些子句中使用表达式赋值语法可能会造成无法预期的结果集。

一个常见的用法是在投影列中使用@var_name := @var_name +1的方式来标记结果集的行号,KingbaseES提供的row_number函数能够替代上述使用方式。

5cfda94ad85a639d84c181ac6b724e42.png

如果事务执行时语句中包含用户变量赋值,事务回滚时用户变量不会被回滚。

在KingbaseES的操作符中有许多包含@字符的操作符,用户变量在和操作符混用时,为了避免产生语法错误,需要将用户变量和操作符用空格隔开。例如@var_name:=@var_name+1虽然可以执行,但还是建议写成@var_name := @var_name + 1的形式。因为我们无法避免用户将:=@定义为操作符。

字符“@”在KingbaseES中也可作为操作符,为了兼容原生KingbaseES,@var_name中的var_name将解析成用户变量,这里“@”为用户变量引导符。而@ var_name中的var_name将解析成标识符,“@”为操作符。

END

用户变量的设计是KingbaseES为数据库用户提供易用性方面的一次探索。用户可以利用用户变量暂存中间值,该中间值既可以在同一连接内跨语句使用,也可以在同一条语句的不同运算中使用。和局部变量相比,用户变量突破了块的作用域限制,使用范围更大。此外,由于用户变量自身的特点(单值存储,类型可变),造成了用户变量使用受到了限制。在未来,KingbaseES会继续秉承以客户为中心的理念,为数据库使用者提供更加易用的功能。

推荐阅读 (点击下图了解更多↓↓↓↓)

9ef2359c97ae0d227716bd2347a35f0a.jpeg

6b60be868aa3c6c2ab1e3ea89275e320.jpeg

1236d4837e28d8de146611a683a09b20.png

ddf0696e2eb16d47411b46e8f47b40a4.png供稿:产品研发中心

编辑:王堇

审核:日尧

9b0a4a81ac788be198cc06ae1640419a.gif

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

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

相关文章

.Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)

机缘 不知不觉,.NET8都已经面世,而我们一直还停留在.netframework4.5开发阶段,最近准备抽空研究一下.Net6,一是为了提高技术积累,一方面想着通过这次的学习,看有没有可能将老的FX版本替换到.Net6开发上,经过查找官方资料,对.Net6支持的系统版本做一个分享,方便大家后期…

python-ATM机

编写程序,实现一个具有开户、查询、取款、存款、转账、锁定、解锁、退出功能的银行管理系统。 结果展示 1.Main主方法 from zzjmxy.class7.atm import ATM from zzjmxy.class7.manager import Manager # 主面板,实现主要逻辑if __name__"__main__…

你的AI生成物侵权了吗?

你的AI生成物侵权了吗? 本文目录: 一、前置背景 1.1、什么是版权 1.2、什么是作品 1.3、什么是创作 1.4、什么是肖像权 1.5、什么是名誉 二、AI生成的作品是否具备版权?如果具备,版权应该属于谁? 三、AI 学习时…

Hadoop进阶学习---Yarn资源调度架构

1.Yarn执行MR流程 1.客户端提交一个MR程序给ResourceManager(校验请求是否合法…) 2.如果请求合法,ResourceManager随机选择一个NodeManager用于生成appmaster(应用程序控制者,每个应用程序都单独有一个appmaster) 3.appmaster会主动向ResourceManager的应用管理器(applicatio…

启动 AWS Academy Learner Lab【教学】(Hadoop实验)

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 第一部分 创建实例过程 首先,需要创建3台EC2,一台作主节点 (master node),两台作从节点 (slaves node)。 1.镜像选择 EC2&…

金蝶云星空表单插件单据体批量删除,序号自增

文章目录 金蝶云星空表单插件单据体批量删除,序号自增字段标识说明表单插件获取单据体数据包移除物料为空的行其他移除物料为空的行的方式,但是测试不通过,不建议使用序号重新生成测试 金蝶云星空表单插件单据体批量删除,序号自增…

Hadoop进阶学习---HDFS分布式文件存储系统

1.hdfs分布式文件存储的特点 分布式存储:一次写入,多次读取 HDFS文件系统可存储超大文件,时效性较差. HDFS基友硬件故障检测和自动快速恢复功能. HDFS为数据存储提供很强的扩展能力. HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改. HDFS可以在普通廉价的机器…

【新手解答8】深入探索 C 语言:递归与循环的应用

C语言的相关问题解答 写在最前面问题:探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸:递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流,回想起了当初的我C…

葡萄酒的储存条件会影响葡萄酒的陈酿吗?

自20世纪末以来,葡萄酒储存有关的行业一直在增长,一些葡萄酒鉴赏家可能会选择将葡萄酒存放在家里的专用房间或壁橱里。 自云仓酒庄品牌雷盛红酒分享总所周知,瓶装葡萄酒的储存条件是会影响葡萄酒的陈酿,振动和热波动会加速葡萄酒的…

室内外融合便携式定位终端5G+UWB+RTK

一、介绍 便携式定位终端主要用于提供高精度的位置数据,支持室内UWB定位和室外北斗系统定位功能,支持5G公网和5G专网通信功能,便携式定位终端中超宽带(UWB)和实时动态(RTK)技术的集成代表了精确位置跟踪方面的重大进步。这款UWBRTK便携式定位…

fastadmin权限树。树形下拉框

fastadmin 笔记 权限树 在构造方法中编写相应的代码 值得一提的是,你的表必须有 id 字段以及 pid 字段。 // 必须将结果集转换为数组$ruleList \think\Db::name("state_list")->field(createtime,updatetime, true)->order(id ASC)->select();…

Vue中使用 v-for 循环遍历对象

Vue中使用 v-for 循环遍历对象 start 经常使用 v-for 去遍历我们的数组&#xff0c;然后渲染页面。其实也可以遍历对象&#xff0c;下面介绍一下遍历对象的写法。 代码示例 <template><div id"app"><div v-for"(value, key) in obj" :k…

【23-24 秋学期】NNDL 作业10 BPTT

习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度&#xff0e; 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&#xff0e; 习题6-2P 设计简单RNN模型&#xff0c;分别…

VSCode 配置JavaScript环境

首先下载node.js&#xff0c;我的电脑是Windows10版本 之后安装node 在这里插入图片描述 安装成功 如果发现运行的时候还是报错&#xff0c;则添加环境变量试试 在Windows10版本的搜索框&#xff0c;搜索环境变量&#xff0c;点击 D:\Program Files\nodejs\ %NODE_HOME…

ArcGIS平滑处理栅格数据

一、实验背景 基于栅格数据的空间分析&#xff0c;常常需要根据特定的分析场景对栅格数据进行处理&#xff0c;如栅格数据的噪声处理。噪声是属性值具有突跃特征的像元位置&#xff0c;直接对带有噪声的栅格数据进行分析会对结果造成较大的影响。而降噪的主要方法之一是平滑&a…

Vue 生成包含数字大小写字母的随机字符串

generateRandomID() {const characters 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;const idLength 30; // 字符串长度 这里生成30位的let randomID ;for (let i 0; i < idLength; i) {const randomIndex Math.floor(Math.random() * characters…

GitHub Copilot试用指南

GitHub Copilot试用指南 首先读这个文档&#xff0c;按照步骤开启30天的试用&#xff1a;管理个人帐户的 GitHub Copilot 订阅 然后读这个文档&#xff1a;使用 IDE 中的 GitHub Copilot 聊天 &#xff0c;在你习惯使用的IDE中配置copilot&#xff0c;暂时好像只支持jetbrai…

EM32DX-E4【C#】

1外观&#xff1a; ecat总线&#xff0c;分布式io 2电源&#xff1a; 靠近SW拨码&#xff1a;24V 中间&#xff1a;0V 靠近面板&#xff1a;PE接地 3DI&#xff1a; 6000H DI输入寄存器 16-bit &#xff08;16位输入&#xff09; 00H U8 子索引总数 01H Unsigned16 IN1…

YoloV5改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎&#xff0c;用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染&#xff0c;并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染&#xff08;PBR&#xff09;&…