Oracle 数据库的绑定变量特性及应用
2009-12-29 13:50
302 查看
关键词:
绑定变量(binding variable),共享池(shared buffer pool), SGA(system global area);
在开发一个数据库
系统前,有谁对Oracle 系统了解很多,尤其是它的特性,好象很少吧;对初学者来讲,这更是不可能的事情;仅仅简单掌握了SQL
的写法,就开始了数据库的开发,其结果只能是开发一个没有效率,也没有可扩展的系统;
j8m*uA$_G*T[`u0
因此,我写这个主题也是希望让大家更多地掌握Oracle数据库的特性,从而在架构一个新系统时,能考虑系统的可扩展,可伸缩性,也兼顾系统的效率和稳定;ITPUB个人空间'm/jSI'B
/'^H
vm
e#u!V/[0
使用绑定变量是Oracle数据库的特性之一;于是大家要问,为什么使用,怎样使用,它的使用限制条件是什么?我会按照这样的想法去解答大家的疑问,我也会以举例子的方式来回答这些问题;
1. 为什么使用绑定变量?ITPUB个人空间
Mh,tMh%@ V/f
这是解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle 运行减慢,甚至完全终止,那就可以不用绑定变量;ITPUB个人空间Ao/}4E&Qu]
这里举例说明上述问题;ITPUB个人空间 t:UG)Y]
为了查询一个员工代号是123,你可以这样查询:
aSB$C&Gx DR,K0
select * from emp where empno=’123’;ITPUB个人空间9K9KI^0s w
你也可以这样查询:ITPUB个人空间gu'Pp8M @j5E{v O
select * from emp where empno=:empno;
象
我们往常一样,你查询员工’123’一次以后,有可能再也不用;接着你有可能查询员工’456’,然后查询’789’等等;如果查询使用象第一个查询语
句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;ITPUB个人空间3U%^,cD2Mm�XD
]
第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别;
T.sEeLPd0
第
一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似
的,系统的整体性能降低;
而执行绑定变量,提交相同对象的完全相同的查询的用户(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳
语; 打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源;
^l-[0N.ud0
ITPUB个人空间P.Z,B;g,D j4Ww
下面举例子去详细论证上述的问题,不使用绑定变量为生病状况:
这是一个未使用的绑定变量(吃药前):
ITPUB个人空间}B-KG'XAQ
set echo on;(把执行结果显示出来)
8Hl!O�F.zc0
alter system flush shared_pool;ITPUB个人空间8k,v0y#no6n+C
这条语句是清空共项池,每次都必须使用,确保共享池是空的,以提高执行效率;ITPUB个人空间&jr%D&jZXY.x
set timing on(打开记时器.)
declare
$`8Q�n|cW [0
type rc is ref cursor;ITPUB个人空间.I9bM [`w,E
l_rc rc;ITPUB个人空间eyg3zc6g"U.N0M`
l_dummy all_objects.object_name%type;ITPUB个人空间 Fi(x,n|L
l_start number default dbms_utility.get_time;
-_yo1kb+}�/0
beginITPUB个人空间#V'hVX:M�e
for i in 1 .. 1000
g.OT&H `&p`!g4v S0
loopITPUB个人空间A�OE
]+]6wn
open l_rc forITPUB个人空间HFK(uXY9L| Y�M.y
'select object_name
t/}F(fu9l@(ZX0
from all_objects
I)t1g bQ1k0R)~0
where object_id = ' || i;ITPUB个人空间C
r,P@
e
fetch l_rc into l_dummy;ITPUB个人空间P)jK4?H}+j
close l_rc;
9t/y(gY)~1ZW@0
end loop;
iHDzfg5j&C0
dbms_output.put_lineITPUB个人空间Q*c"T4W u
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||ITPUB个人空间|FA,N~M
' seconds...' );ITPUB个人空间.jGu_Y#zVA
end;
rNd%s/W9I0
/
~r
K6x#]"B.Y0
PL/SQL 过程已成功完成。
执行时间: 已用时间: 00: 00: 07.03
0WXp%T x&oU+};j0
这是一个使用的绑定变量(吃药后):
i
FBi)? X1j0
set echo on
alter system flush shared_pool;ITPUB个人空间}w"KP!dO6t'L|uk x
declareITPUB个人空间K.y4/-O#D%oo
type rc is ref cursor;
_ra^1m0l#V*_0
l_rc rc;
*Vou;wb c/A|'B1|0
l_dummy all_objects.object_name%type;ITPUB个人空间/mp8I�lj3O"]Dn
l_start number default dbms_utility.get_time;ITPUB个人空间S|.l$wY�Q8d0[1d
beginITPUB个人空间�xL&LvhSw#B9Wh
for i in 1 .. 1000ITPUB个人空间;p(wuHta.A
loop
'F5?(z8[?9q0
open l_rc for
OI*G,Fx^)n kO0
'select object_nameITPUB个人空间*O5fo-J Y%M]F3f
from all_objects
l8gI4z@U7]a"~|0
where object_id = :x'ITPUB个人空间/R�^gk s y*{
using i;
fLn%X Z0
fetch l_rc into l_dummy;ITPUB个人空间u~-z|Y#wS
close l_rc;
wL/#braQ.r0
end loop;ITPUB个人空间)A)/"gTr
dbms_output.put_lineITPUB个人空间/Fd
uy8J+u.t
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||ITPUB个人空间C(zmB(Eec
' seconds...' );ITPUB个人空间IMQ8Al:Fa
end;ITPUB个人空间r4lhs7c'F
Y
PL/SQL 过程已成功完成。
执行时间: 已用时间: 00: 00: 00.75
大家自己比较结果,相差就是一个数量级;使用绑定变量不仅仅是运行快,而且允许多个用户同时使用;
上述的环境是在数据库Oracle 8.1.7, 操作系统: Windows Server
2003,内存 1G , CPU: P4 3.4GHZ ; 电脑配置不同,执行的结果是有差异的;
2. 怎样使用绑定变量?
9`Y? t;ON9o
F0
下面举例说明:
!o~5O.M&Zi0
2.1.让Oracle自己绑定变量(也叫静态绑定变量)
set serverout on;
0QZ6v"Yg*I8m0
set timing on;
.ca,_ [.e"D^"N0
declareITPUB个人空间i7q~5l*[F�r
l_sql varchar2(2000);ITPUB个人空间c|(^v!A�m
l_count number;ITPUB个人空间 HDVg o;f#cG
l_param1 varchar2(100);
"?%h
l2I"z's,V0
l_param2 varchar2(100);ITPUB个人空间6c5G2@!ECB)@
begin
;o8b;G
pBH4[(T:t%m)[0
l_param1:='a';
VP6h-?X"rks@E7p0
l_param2:='b';
Xvn'pylE.n/N
X0
select count(*) into l_count from table1 where col_1=l_param1 and col_2=l_param2;ITPUB个人空间xR ]8ZEVC
dbms_output.put_line(l_count);
$zaOzQ.t0
end;ITPUB个人空间vp�T7qB"o!U
/
/T @
](RmD
qv0
在上面的情况,Oracle会自己绑定变量,即,如果参数保存在一个数组中,select语句放在一个循环中,
%wh%djc,a0
select 语句只会编译一次。
2.2 .动态绑定变量
CB+X*bx)KpQ$C0
set serverout on;ITPUB个人空间:V[q�rI&P
绑定变量(binding variable),共享池(shared buffer pool), SGA(system global area);
在开发一个数据库
系统前,有谁对Oracle 系统了解很多,尤其是它的特性,好象很少吧;对初学者来讲,这更是不可能的事情;仅仅简单掌握了SQL
的写法,就开始了数据库的开发,其结果只能是开发一个没有效率,也没有可扩展的系统;
j8m*uA$_G*T[`u0
因此,我写这个主题也是希望让大家更多地掌握Oracle数据库的特性,从而在架构一个新系统时,能考虑系统的可扩展,可伸缩性,也兼顾系统的效率和稳定;ITPUB个人空间'm/jSI'B
/'^H
vm
e#u!V/[0
使用绑定变量是Oracle数据库的特性之一;于是大家要问,为什么使用,怎样使用,它的使用限制条件是什么?我会按照这样的想法去解答大家的疑问,我也会以举例子的方式来回答这些问题;
1. 为什么使用绑定变量?ITPUB个人空间
Mh,tMh%@ V/f
这是解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle 运行减慢,甚至完全终止,那就可以不用绑定变量;ITPUB个人空间Ao/}4E&Qu]
这里举例说明上述问题;ITPUB个人空间 t:UG)Y]
为了查询一个员工代号是123,你可以这样查询:
aSB$C&Gx DR,K0
select * from emp where empno=’123’;ITPUB个人空间9K9KI^0s w
你也可以这样查询:ITPUB个人空间gu'Pp8M @j5E{v O
select * from emp where empno=:empno;
象
我们往常一样,你查询员工’123’一次以后,有可能再也不用;接着你有可能查询员工’456’,然后查询’789’等等;如果查询使用象第一个查询语
句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;ITPUB个人空间3U%^,cD2Mm�XD
]
第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别;
T.sEeLPd0
第
一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似
的,系统的整体性能降低;
而执行绑定变量,提交相同对象的完全相同的查询的用户(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳
语; 打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源;
^l-[0N.ud0
ITPUB个人空间P.Z,B;g,D j4Ww
下面举例子去详细论证上述的问题,不使用绑定变量为生病状况:
这是一个未使用的绑定变量(吃药前):
ITPUB个人空间}B-KG'XAQ
set echo on;(把执行结果显示出来)
8Hl!O�F.zc0
alter system flush shared_pool;ITPUB个人空间8k,v0y#no6n+C
这条语句是清空共项池,每次都必须使用,确保共享池是空的,以提高执行效率;ITPUB个人空间&jr%D&jZXY.x
set timing on(打开记时器.)
declare
$`8Q�n|cW [0
type rc is ref cursor;ITPUB个人空间.I9bM [`w,E
l_rc rc;ITPUB个人空间eyg3zc6g"U.N0M`
l_dummy all_objects.object_name%type;ITPUB个人空间 Fi(x,n|L
l_start number default dbms_utility.get_time;
-_yo1kb+}�/0
beginITPUB个人空间#V'hVX:M�e
for i in 1 .. 1000
g.OT&H `&p`!g4v S0
loopITPUB个人空间A�OE
]+]6wn
open l_rc forITPUB个人空间HFK(uXY9L| Y�M.y
'select object_name
t/}F(fu9l@(ZX0
from all_objects
I)t1g bQ1k0R)~0
where object_id = ' || i;ITPUB个人空间C
r,P@
e
fetch l_rc into l_dummy;ITPUB个人空间P)jK4?H}+j
close l_rc;
9t/y(gY)~1ZW@0
end loop;
iHDzfg5j&C0
dbms_output.put_lineITPUB个人空间Q*c"T4W u
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||ITPUB个人空间|FA,N~M
' seconds...' );ITPUB个人空间.jGu_Y#zVA
end;
rNd%s/W9I0
/
~r
K6x#]"B.Y0
PL/SQL 过程已成功完成。
执行时间: 已用时间: 00: 00: 07.03
0WXp%T x&oU+};j0
这是一个使用的绑定变量(吃药后):
i
FBi)? X1j0
set echo on
alter system flush shared_pool;ITPUB个人空间}w"KP!dO6t'L|uk x
declareITPUB个人空间K.y4/-O#D%oo
type rc is ref cursor;
_ra^1m0l#V*_0
l_rc rc;
*Vou;wb c/A|'B1|0
l_dummy all_objects.object_name%type;ITPUB个人空间/mp8I�lj3O"]Dn
l_start number default dbms_utility.get_time;ITPUB个人空间S|.l$wY�Q8d0[1d
beginITPUB个人空间�xL&LvhSw#B9Wh
for i in 1 .. 1000ITPUB个人空间;p(wuHta.A
loop
'F5?(z8[?9q0
open l_rc for
OI*G,Fx^)n kO0
'select object_nameITPUB个人空间*O5fo-J Y%M]F3f
from all_objects
l8gI4z@U7]a"~|0
where object_id = :x'ITPUB个人空间/R�^gk s y*{
using i;
fLn%X Z0
fetch l_rc into l_dummy;ITPUB个人空间u~-z|Y#wS
close l_rc;
wL/#braQ.r0
end loop;ITPUB个人空间)A)/"gTr
dbms_output.put_lineITPUB个人空间/Fd
uy8J+u.t
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||ITPUB个人空间C(zmB(Eec
' seconds...' );ITPUB个人空间IMQ8Al:Fa
end;ITPUB个人空间r4lhs7c'F
Y
PL/SQL 过程已成功完成。
执行时间: 已用时间: 00: 00: 00.75
大家自己比较结果,相差就是一个数量级;使用绑定变量不仅仅是运行快,而且允许多个用户同时使用;
上述的环境是在数据库Oracle 8.1.7, 操作系统: Windows Server
2003,内存 1G , CPU: P4 3.4GHZ ; 电脑配置不同,执行的结果是有差异的;
2. 怎样使用绑定变量?
9`Y? t;ON9o
F0
下面举例说明:
!o~5O.M&Zi0
2.1.让Oracle自己绑定变量(也叫静态绑定变量)
set serverout on;
0QZ6v"Yg*I8m0
set timing on;
.ca,_ [.e"D^"N0
declareITPUB个人空间i7q~5l*[F�r
l_sql varchar2(2000);ITPUB个人空间c|(^v!A�m
l_count number;ITPUB个人空间 HDVg o;f#cG
l_param1 varchar2(100);
"?%h
l2I"z's,V0
l_param2 varchar2(100);ITPUB个人空间6c5G2@!ECB)@
begin
;o8b;G
pBH4[(T:t%m)[0
l_param1:='a';
VP6h-?X"rks@E7p0
l_param2:='b';
Xvn'pylE.n/N
X0
select count(*) into l_count from table1 where col_1=l_param1 and col_2=l_param2;ITPUB个人空间xR ]8ZEVC
dbms_output.put_line(l_count);
$zaOzQ.t0
end;ITPUB个人空间vp�T7qB"o!U
/
/T @
](RmD
qv0
在上面的情况,Oracle会自己绑定变量,即,如果参数保存在一个数组中,select语句放在一个循环中,
%wh%djc,a0
select 语句只会编译一次。
2.2 .动态绑定变量
CB+X*bx)KpQ$C0
set serverout on;ITPUB个人空间:V[q�rI&P
相关文章推荐
- Oracle 数据库的绑定变量特性及应用
- 【SQL】Oracle 数据库的绑定变量特性及应用
- Oracle 数据库的绑定变量特性及应用
- Oracle 数据库的绑定变量特性及应用
- Oracle 数据库的绑定变量特性及应用
- Oracle 数据库的绑定变量特性及应用
- Oracle 数据库的绑定变量特性及应用
- Oracle绑定变量在C#.NET中的应用及意义
- Oracle数据库绑定变量特性及应用
- Oracle数据库绑定变量特性及应用
- Oracle数据库绑定变量特性及应用
- 数据库优化—ORACLE动态绑定变量
- Oracle数据库绑定变量特性及应用
- Oracle绑定变量在C#.NET中的应用及意义
- Oracle数据库绑定变量特性及应用
- oracle 绑定变量的作用和应用
- Oracle数据库绑定变量特性及应用
- 用反射+特性列出所有的枚举变量及其描述信息,绑定到DropDownList上
- [转]用反射+特性列出所有的枚举变量及其描述信息,绑定到DropDownList上。
- JAVA 程序中使用ORACLE 绑定变量( bind variable )