菜鸟笔记
提升您的技术认知

什么是sql绑定变量,如何实现绑定变量?-ag真人游戏

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实现绑定变量的方法:
 
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元,不使用绑定变量,则:

 
 
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"); 

使用绑定变量,则:

 
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将会实现真正意义上的绑定变量,让用户享受到绑定变量带来的好处。
网站地图