三大兼容 | 人大金仓兼容+优化MySQL用户变量特性
目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使数据库的易用性得到了极大优化,下面来一探究竟吧!
什么是用户变量?
用户变量是用户自定义的保存单个特定类型数据值的临时对象,是为了适应在数据库使用时需要临时暂存值的场景而设计的,目的是提高数据库系统的易用性。
用户变量的应用场景十分广泛,以下是两个典型的使用场景:
(1) 用于暂存值,当某个数值需要出现在不同的查询中,或者是同一个查询内的不同位置时,可以先将该数值赋给用户变量,在查询中使用该数值的位置用用户变量替代。例如:
(2) 用于表达式递归计算,递归计算中需要用到变量的值,同时要将计算结果重新赋给变量,循环往复。比如投影列中需要标记结果集的行号时,可以写成如下语句:
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的语义解析顺序,离该取值最近的赋值类型确定为用户变量的数据类型。如果用户变量没有赋值,使用已存在用户变量类型;如果用户变量不存在,则取默认类型(字符串)。举例如下:
在查询执行时,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函数能够替代上述使用方式。
如果事务执行时语句中包含用户变量赋值,事务回滚时用户变量不会被回滚。
在KingbaseES的操作符中有许多包含@字符的操作符,用户变量在和操作符混用时,为了避免产生语法错误,需要将用户变量和操作符用空格隔开。例如@var_name:=@var_name+1虽然可以执行,但还是建议写成@var_name := @var_name + 1的形式。因为我们无法避免用户将:=@定义为操作符。
字符“@”在KingbaseES中也可作为操作符,为了兼容原生KingbaseES,@var_name中的var_name将解析成用户变量,这里“@”为用户变量引导符。而@ var_name中的var_name将解析成标识符,“@”为操作符。
END
用户变量的设计是KingbaseES为数据库用户提供易用性方面的一次探索。用户可以利用用户变量暂存中间值,该中间值既可以在同一连接内跨语句使用,也可以在同一条语句的不同运算中使用。和局部变量相比,用户变量突破了块的作用域限制,使用范围更大。此外,由于用户变量自身的特点(单值存储,类型可变),造成了用户变量使用受到了限制。在未来,KingbaseES会继续秉承以客户为中心的理念,为数据库使用者提供更加易用的功能。
推荐阅读 (点击下图了解更多↓↓↓↓)
供稿:产品研发中心
编辑:王堇
审核:日尧
相关文章:
三大兼容 | 人大金仓兼容+优化MySQL用户变量特性
目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使…...
Git介绍与安装使用
目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…...
理解DuLinkList L中的“”引用符号
在C中,DuLinkList &L 这种形式的参数表示 L 是一个 DuLinkList 类型的引用。这里的 & 符号表示引用。 引用是C的一个特性,它提供了一种方式来访问已存在的变量的别名。当你对引用进行操作时,实际上是在操作它所引用的变量。如果你在…...
前端并发多个请求并失败重发
const MAX_RETRIES 3;// 模拟请求 function makeRequest(url) {return new Promise((resolve, reject) > {setTimeout(() > {Math.random() < 0.75 ? resolve(${url} 成功) : reject(${url} 失败); // 随机决定请求是否成功}, Math.random() * 2000); // 随机延时执…...
【Qt开发流程】之对象模型2:属性系统
描述 Qt提供了一个复杂的属性系统,类似于一些编译器供应商提供的属性系统。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译器特性,如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…...
PHP之curl详细讲解
cURL(全称为Client for URLs)是一个功能强大的开源库,用于在多种协议上进行数据传输、发送HTTP请求和获取响应。它支持多种协议,包括HTTP、HTTPS、FTP、SMTP等,并且能够与各种服务器进行通信。 cURL库可以通过命令行工…...
R语言30分钟上手
文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…...
上下拉电阻会增强驱动能力吗?
最近看到一个关于上下拉电阻的问题,发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下,大家一致认为不存在上下拉电阻增强驱动能力这回事,因为除了OC输出这类特殊结构外,上下拉电阻就是负载,只会减…...
题目:小明的彩灯(蓝桥OJ 1276)
题目描述: 解题思路: 一段连续区间加减,采用差分。最终每个元素结果与0比较大小,比0小即负数输出0。 题解: #include<bits/stdc.h> using namespace std;using ll long long; const int N 1e5 10; ll a[N],…...
换元法求不定积分
1.一般步骤:选取换元对象(不一定是式子中的值,也可以是式子中的最小公倍数或者最大公因数),然后将dx换为dt*t的导数,再用t将原式表示,化简计算即可 2. 3. 4. 5. 6....
在Docker容器中启用SSH服务,实现外部访问的详细教程
目录 步骤 1: 安装 SSH 服务器 步骤 2: 配置 SSH 服务器 步骤 3: 设置 SSH 用户 步骤 4: 重启 SSH 服务器 步骤 5: 映射容器端口 步骤 6: 使用 SSH 连接到容器 要在Docker容器中启用SSH服务,以便从外部访问,您需要执行以下步骤: 步骤 …...
Go 模块系统最小版本选择法 MVS 详解
目录 Golang 模块系统简介 包版本管理 最小版本选择(MVS)原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性,主要目的是解决 Go 项目中的依赖管理问题。在模…...
ifstream读取txt中的中文数据转成QString出现乱码
使用ifstream从txt文本中读取中文数据到string,再将string转成QString输出时出现了乱码。 分析:如果ifstream能成功从txt文本中读出中文数据,那大概率txt用的编码是ANSI编码(GBK就是ANSI的一种),那么在转成…...
UE4 双屏分辨率设置
背景: 做了一个UI 应用,需要在双屏上进行显示。 分辨率如下:3840*1080; 各种折腾,其实很简单: 主要是在全屏模式的时候 一开始没有选对,双屏总是不稳定。 全屏模式改成:Windows 之…...
$sformat在仿真中打印文本名的使用
在仿真中,定义队列,使用任务进行函数传递,并传递文件名,传递队列,进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串,在仿真的时候进行文件…...
【Rust】结构体与枚举
文章目录 结构体struct基础用法使用字段初始化简写语法使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体方法语法关联函数多个 impl 块 枚举枚举值Option 结构体struct 基础用法 一个存储用户账号信息的结构体: struct User {active: bo…...
CentOS7 防火墙常用命令
以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令: 检查防火墙状态: sudo firewall-cmd --state 启动防火墙: sudo systemctl start firewalld 停止防火墙: sudo systemctl stop firewalld 重启防火墙&…...
【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目
什么是UL9540测试,UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室(Underwriters Laboratories)发布的标准,名称为"UL 9540: Energy Storage Systems and Equipment",翻译为中文为"能量存储…...
springcloud整合Oauth2自定义登录/登出接口
我使用的是password模式,并配置了token模式 一、登录 (这里我使用的示例是用户名密码认证方式) 1. Oath2提供默认登录授权接口 org.springframework.security.oauth2.provider.endpoint.postAccess; Tokenpublic ResponseEntity<OAuth2AccessToken> pos…...
Oracle常见内置程序包的使用Package
Oracle常见内置程序包的使用 点击此处可跳转至:Oracle的程序包(Package),对包的基础进行学习常见内置程序包的使用Package1、DBMS_OUTPUT包2、DBMS_XMLQUERY包3、DBMS_RANDOM包4、UTL_FILE包5、DBMS_JOB包6、DBMS_LOB包7、DBMS_SQL包8、DBMS_LOCK包9、DB…...
Flutter:视频下载案例
前言 最近在研究视频下载,因此打算一边研究一边记录一下。方便以后使用时查看。 使用到的库有: permission_handler 11.1.0 :权限请求 flutter_downloader 1.11.5:文件下载器 path_provider 2.1.1:路径处理 视频…...
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南 第2章:指令提示技术 现在,让我们开始探索“指令提示技术”,以及如何使用它从ChatGPT生成高质量的文本。 指令提示技术是一种通过为模型提供特定指令来指导ChatGPT输出的方…...
JDK 历史版本下载以及指定版本应用
参考: 官网下载JAVA的JDK11版本(下载、安装、配置环境变量)_java11下载-CSDN博客 Gradle:执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里,但是我们要下载历史版本 选…...
Linux基础项目开发1:量产工具——UI系统(五)
前言: 前面我们已经把显示系统、输入系统、文字系统搭建好了,现在我们就要给它实现按钮操作了,也就是搭建UI系统,下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…...
面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题
面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路 面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题 面试就是这么简单,offer拿到手软(三ÿ…...
深入理解Redis分片策略:提升系统性能的关键一步
目录 引言 1. 一致性哈希算法 2. 范围分片 3. 哈希槽分片 实战经验分享 结论 引言 Redis作为一款高性能的键值存储系统,为了应对大规模数据和高并发的访问,引入了分片策略,使得数据能够分布存储在多个节点上,实现系统的横向…...
【数据结构(七)】查找算法
文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中,我们…...
Android画布Canvas绘制drawBitmap基于源Rect和目的Rect,Kotlin
Android画布Canvas绘制drawBitmap基于源Rect和目的Rect,Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns…...
深度优先搜索LeetCode979. 在二叉树中分配硬币
给你一个有 n 个结点的二叉树的根结点 root ,其中树中每个结点 node 都对应有 node.val 枚硬币。整棵树上一共有 n 枚硬币。 在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。移动可以是从父结点到…...
C++学习之路(十)C++ 用Qt5实现一个工具箱(增加一个时间戳转换功能)- 示例代码拆分讲解
上篇文章,我们用 Qt5 实现了在小工具箱中添加了《JSON数据格式化》功能,还是比较实用的。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 时间戳转换 」功能,而且实现点击按钮后文字进行变…...
微信小程序二维码/seo 优化 工具
一、shell脚本的初识 二、shell脚本的创建与运行方式 三、shell脚本的变量定义 四、shell脚本的判断语句 五、shell脚本的循环语句 六、...
如何在网站做投票/云搜索系统
每篇文章我们都先抛出自己的疑问,然后随着阅读的深入,我们可以逐一解答这些问题 问题抛出: 1.JDK,JRE,JVM区别? JDK:总共分为三部分,java程序设计语言,Java虚拟机,Java API类库,JD…...
郑州百度网站优化/长沙网站设计
List的有用实现1.ArrayList2.LinkedList3.Vector4.Stack讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。LinkedList是基于链表实现的&…...
国外做vj的网站/永州网络推广
前言: 视觉小车最重要的是视觉功能,其实现方式主要有: Opencv外置计算机摄像头。需要计算机作为上位机。Stm32OV7670。较难,大师级。OpenMV摄像头。较简单,入门级。 博主刚开始为了准备项目,了解尝试过前…...
哈尔滨做网站需要多少钱/网络营销策略的制定
在Java应用中进行集合对象间的转换是非常常见的事情,有时候在处理某些任务时选择一种好的数据结构往往会起到事半功倍的作用,因此熟悉每种数据结构并知道其特点对于程序员来说是非常重要的,而只知道这些是不够的,有时候你需要一个…...
怎样创建自己的网站/高端网站建设公司哪家好
vim /etc/hostname vim /etc/hosts reboot...