什么是SQL绑定变量,如何实现绑定变量?
2013-05-18 12:02
441 查看
1. 认识绑定变量:
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 plaincopysql.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 plaincopyPreparedStatement 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次复用第一次生成的执行计划。显然,后者效率会更高一些。
b. 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。
转自:http://blog.csdn.net/maray/article/details/7663598
绑定变量是为了减少解析的,比如你有个语句这样 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 plaincopyPreparedStatement 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 plaincopysql.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 plaincopyPreparedStatement 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将会实现真正意义上的绑定变量,让用户享受到绑定变量带来的好处。
转自:http://blog.csdn.net/maray/article/details/7663598
相关文章推荐
- 什么是SQL绑定变量,如何实现绑定变量?
- 什么是sql绑定变量?怎么实现绑定变量?
- 如何获取trace中sql所绑定变量的值
- 如何查看共享池中哪些sql没有绑定变量--from ask tom
- 用sys_context 和Native Dynamic SQL实现变量绑定
- 如何查找硬解析问题,找到未使用绑定变量的SQL---脚本
- 如何监控并找出系统中存在的大量的未使用绑定变量的SQL
- 动态SQL中的重复占位符如何与绑定变量进行绑定
- 如何获取Oracle share pool中没有使用绑定变量的SQL
- WPF数据绑定机制是如何实现
- 在头文件中定义变量以及static变量意味着什么?全局变量要如何正确使用?关键字extern要怎么用?
- 什么是对象序列化?如何实现?什么情况下使用?
- 查看未绑定变量SQL
- PHP内核探索 —— 变量概述:变量在PHP的内部如何实现
- C#中,datagridview与sql数据源绑定后,通过控件更改数据如何自动回写更新到数据源
- SQL如何实现远程数据库链接
- Oracle PL/SQL编程之如何实现程序来统计另一个程序的性能(接上一篇 优化后)
- 如何在Web页面中绑定服务器端变量
- 什么是java序列化,如何实现java序列化?