什么是SQL绑定变量,如何实现绑定变量?
上一篇 / 下一篇 2012-06-18 09:26:56 / 个人分类:数据库
*Rt/q Hk$O0 绑定变量是为了减少解析的,比如你有个语句这样
a)gA0~Gm q5jyt0h(M lR7|-kqA0 select aaa,bbb from ccc where ddd=eee;51Testing软件测试网e`f:Z!Z7c'aO d+l
51Testing软件测试网,xY @io6hB如果经常通过改变eee这个谓词赋值来查询,像如下51Testing软件测试网2M*R c8q+UqP0R{$y
51Testing软件测试网:J0wz}0~^ H$^/n2e select aaa,bbb from ccc where ddd=fff;51Testing软件测试网
Y3z4V7x]#~0K
select aaa,bbb from ccc where ddd=ggg;
\:e#jA0zZ+p0 select aaa,bbb from ccc where ddd=hhh;51Testing软件测试网
FOb(H7_
f;XnJi
&qi['Zq6s0 每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析51Testing软件测试网a*uYB+{
qKJZW7x6L6G0 Java实现绑定变量的方法:
ig2sLWW;SA0 PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?"); ]G,TTi0 pstmt.setBigDecimal(1, 15.00);51Testing软件测试网r9h5e!wm,d Vl8z$K8ub pstmt.setInt(2, 110592); 3i,e.C4[2P5^A3{1x0//result statmement: UPDATE employees SET salay = 15.00 WHERE id = 11059251Testing软件测试网%Og2b7Wp la6e ` pstmt.executeQuery(); |
4cI[v/}+`W0 假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:51Testing软件测试网&T W| N"rOv2X
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1"); 8pJ;^m5@Fhi.@0sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");51Testing软件测试网 M^j-\'NH){w sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3"); ^:lUe-ql D9_0sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");51Testing软件测试网:fj`+so[ .... $au5bFa z_-d0sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000"); |
使用绑定变量,则:
RF.P c g0 PreparedStatement pstmt;51Testing软件测试网k8i [Lt
G Z for (id = 1; id < 10000; id++)51Testing软件测试网bmK9I[l$PP"\6q { 2WGU6Un*KZ+e0 if (null == pstmt) z$ixZO8A3i ?0 pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?"); |,FW$R ]-R W0 pstmt.setBigDecimal(1, 150.00); UV#nNXC;O3}0 pstmt.setInt(2, id);51Testing软件测试网,h0J}`r"~7Ov pstmt.executeQuery(); {Y&V2N9[y!v0 } |
|8n"db.A"W ` p0 二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。51Testing软件测试网 B1x M O.wn {
51Testing软件测试网6vnZgud)j2、什么时候不应该/不必要使用绑定变量51Testing软件测试网xI:D7T(WCa.w5o
51Testing软件测试网c){1G{6t&@a)如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。51Testing软件测试网GdpcJ,f*q5mB
51Testing软件测试网i2{:m]STb)变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。