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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【上海大学数字逻辑实验报告】四、组合电路(三)

一、 实验目的 掌握多路选择器74LS151的原理。掌握译码器74LS138的原理。学会在Quartus II上使用多路选择74LS151设计电路。学会在Quartus II上使用译码器74LS138设计电路。 二、 实验原理 多路选择器又称数据选择器或多路开关,它是一种多路输入单路输出的组合逻…

JS实现成才网注册系统(网页数据验证)

主代码 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Conten…

Spring Cloud + Vue前后端分离-第3章 SpringBoot项目技术整合

Spring Cloud Vue前后端分离-第3章 SpringBoot项目技术整合 3-1 集成持久层框架Mybatis ORM:对象关系映射&#xff0c;Hibernate是全自动ORM&#xff0c;Mybatis是半自动ORM&#xff0c;Mybatis可以操作的花样更多&#xff0c;是首选的持久层框架 System模块集成Mybatis框架…

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。

11-30 SpringBoot2

热部署 开发过程中,修改代码,不需要重启,自动更新 项目上线,一定要关闭 SpringBoot热部署的实现&#xff1f;&#xff1f; ideal默认阻止class类更新 2&#xff0e;需要手动构建项目&#xff0c;可以使用快捷键激活此功能ctrl F9 / build project 自动构建项目 允许程序运行…

02、pytest环境准备

工具准备 python官网下载&#xff1a;https://www.python.org/pycharm官网下载&#xff1a;https://www.jetbrains.com.cn/en-us/pycharm/pytest官方文档&#xff1a;https://docs.pytest.org/en/7.4.x/python-office官网文档&#xff1a;http://www.python-office.com/ 参考…

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…

使用腾讯云轻量应用服务器安装宝塔面板建站全流程

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

ElasticSearch篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、谈谈分词与倒排索引的原理二、说说分段存储的思想三、谈谈你对段合并的策略思想的认识前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分…

上海亚商投顾:沪指震荡调整跌 CRO概念股集体大跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指尾盘跌近1%&#xff0c;板块分化较为明显。 CRO概念股集体下挫&#x…

AIGC在天猫商品海报生成上的探索

灵感艺术家项目&#xff0c;旨在通过AIGC绘图能力&#xff0c;联合商家打造低门槛高趣味性的宣传海报设计大赛&#xff0c;本文分享我们的方案和优化方向。建议对AIGC感兴趣的工程、算法方向的同学阅读。 项目背景 灵感艺术家项目&#xff0c;旨在通过AIGC绘图能力&#xff0c;…

Elasticsearch:评估 RAG - 指标之旅

作者&#xff1a;Quentin Herreros&#xff0c;Thomas Veasey&#xff0c;Thanos Papaoikonomou 2020年&#xff0c;Meta发表了一篇题为 “知识密集型NLP任务的检索增强生成” 的论文。 本文介绍了一种通过利用外部数据库将语言模型 (LLM) 知识扩展到初始训练数据之外的方法。 …

07、pytest指定要运行哪些用例

官方用例 # 目录结构 | |----test_mod.py | |----testing||----test_dir.py# content of test_mod.py import pytestdef func(x):return x 1def test_mod():print("test_mod function was invoked")assert func(3) 5def test_func():print("test_func was in…

力扣每日一题:2477. 到达首都的最少油耗(2023-12-05)

力扣每日一题 题目&#xff1a;2477. 到达首都的最少油耗 日期&#xff1a;2023-12-05 用时&#xff1a;34 m 15 s 时间&#xff1a;37ms 内存&#xff1a;84.8MB 思路&#xff1a;分别计算每条路上通过的城市数量&#xff08;数量/座位数&#xff0c;向上取整&#xff09;&…

1.qml-3D入门讲解介绍

本章我们来学习QML 3D教程&#xff0c;QML 3D能够支持windows linux等多平台跨平台并且显示效果大部分一致&#xff0c;非常方便&#xff0c;学习的qt版本最低为qt6.5。 要使用qml 3D类&#xff0c;需要导入QtQuick3D模块。 这是使用空间渲染器和场景图的 QML 前端。目前&…

【C/PTA —— 14.结构体1(课外实践)】

C/PTA —— 14.结构体1&#xff08;课外实践&#xff09; 一.函数题6-1 选队长6-2 按等级统计学生成绩6-3 学生成绩比高低6-4 综合成绩6-5 利用“选择排序算法“对结构体数组进行排序6-6 结构体的最值6-7 复数相乘运算 二.编程题7-5 一帮一7-6 考试座位号 一.函数题 6-1 选队长…

【React + Typescript】使用WebPack包管理、各种扩展插件组成的初始模板,开源协议:CC-BY-4.0

React Typescript Webpack 模板 模板展示项目结构使用的部分扩展包页面配置代码Layout 公共容器组件路由Jspackage.json 开源模板下载TIP 模板展示 项目结构 使用的部分扩展包 &#x1f4c2; System ├── &#x1f4c2; Plugin │ ├── &#x1f4c4; file-loader | 在处…

Java---异常

文章目录 1. 异常概述2. try...catch3. Throwable成员方法4. 编译时异常和运行时异常区别5. 异常处理之throws6. 自定义异常7. throws和throw的区别 1. 异常概述 1. 异常&#xff1a;就是程序中出现了不正常的情况。 2. Error&#xff1a;严重问题&#xff0c;不需要处理。Exce…

基于Java SSM框架实现美食推荐管理系统项目【项目源码+论文说明】

基于java的SSM框架实现美食推荐管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

数智化招采平台档案管理的功能、价值与亮点

2005年4月&#xff0c;《中华人民共和国电子签名法》正式实施&#xff0c;明确电子签名与手写签名具有同等的法律效力。 2013年5月&#xff0c;《电子招标投标办法》正式实施&#xff0c;明确电子招标投标交易平台应当具备电子归档功能。 2021年1月&#xff0c;《中华人民共和…