问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何解析sql语句中的绑定变量

发布网友 发布时间:2022-04-21 06:34

我来回答

1个回答

热心网友 时间:2022-04-09 13:55

1. 认识绑定变量:

绑定变量是为了减少解析的,比如你有个语句这样
select aaa,bbb from ccc where ddd=eee;
如果经常通过改变eee这个谓词赋值来查询,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析

Java实现绑定变量的方法:
[java] view plaincopy
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();

假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:
[java] view plaincopy
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用绑定变量,则:
[java] view plaincopy
PreparedStatement pstmt;
for (id = 1; id < 10000; id )
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。
2. 什么时候不应该/不必要使用绑定变量
a. 如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。
b. 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。

3. 绑定变量在OceanBase中的实现
目前OceanBase中实现了绑定变量,目的主要是为了编程方便,而不是为了降低生成执行计划的代价。为什么呢?因为OceanBase中目前使用的是一种”静态执行计划“,无论什么Query,执行流程都一样。OB在前端代理ObConnector中实现绑定变量,将用户传入的变量进行to_string()操作,替代SQL语句中相应的部分,形成一个完整的SQL。然后这个SQL传递给MS,MS按照标准流程来解析和执行。相信不远的将来,OB将会实现真正意义上的绑定变量,让用户享受到绑定变量带来的好处。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
草青青,青青草,草上接谢珍珠宝,怕日晒怕风摇,摇看珍珠得起早 谜底是... 一加9R要不要升级ColorOS 13正式版 一加9pro怎么coloros12一加9pro升级coloros12的方法 coloros12支持哪些一加机型?coloros12支持一加机型介绍 一加9pro如何coloros12?一加9pro升级coloros12的方法 一加9pro升级coloros12拍照改善吗 我是一个高中生,职教的,我们班上有5个女生,我喜欢有一个,但追她又有... 自动挡d挡旁边的 -是什么意思? 自动挡位上的加减是什么意思? 宣传这个职位是干什么的 mysql oracle hbase Oceanbase 各有什么区别呢 怎样在天猫双十一活动中购物最省钱? 天猫双十一红包怎么抢 oceanbase表组能不能后面加 &quot;以root用户登录各oceanbase服务器&quot;这个具体怎么做 支付宝OceanBase团队怎么样 淘宝研发工程师c&#47;c工资待遇怎么样 如何看待 (2021年) OceanBase 开源? 如何评价OceanBase近期强大的宣传攻势? 什么是九价疫苗 九价疫苗被预约崩了,为什么这种疫苗这么难约? 香港九价HPV疫苗和内地的九价HPV疫苗有什么区别? 去香港打九价宫颈癌疫苗流程是什么,有熟悉的吗 公立医院预约的港版九价疫苗怎么样? 香港hpv九价疫苗和内地九价疫苗有区别吗? 有姐妹可以介绍一家真的香港九价hpv预约平台吗 免费九价政策 去香港打九价疫苗需要预约吗? 现在香港的9价hpv 要怎么打呢? 还能打吗 平常大家都熟悉去香港打9价hpv疫苗流程吗 什么是SQL绑定变量,如何实现绑定变量 哪些股票含有5g概念 5g概念股有哪些股票 什么是5G网络 概念股有哪些 正确的电线的接线方法是怎样的 电线接头怎么接 电线接头方法是什么? 蛇和蟒蛇有什么不一样? 电线接头接法图解 蛇,蚺,蟒怎样区分 电线搭接方法 巨蟒和蟒蛇有什么区别? 蛇和蟒的区别? 电线接头接法 蛇和莽的区别 两根电线对接法图解是怎样的? 水蚺和蟒蛇的区别? 森蚺和蟒蛇的区别是什么? 带电接电线正确接法是什么? 巨蚺和蟒蛇的区别是什么?