技术开发 频道

Oracle数据库绑定变量特性及应用


5.  绑定变量使用限制条件是什么?
    为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用.可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询(这句并不完全可信,有兴趣的可以自己琢磨).

    数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了.

    当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等).
        共享的语句必须满足三个条件:

A.      字符级的比较:
当前被执行的语句和共享池中的语句必须完全相同.
      例如:
          SELECT * FROM EMP;
      和下列每一个都不同
          SELECT * from EMP;
          Select * From Emp;
          SELECT      *     FROM EMP;

B.      两个语句所指的对象必须完全相同:
例如:
   用户                对象名                如何访问
Jack                sal_limit                private synonym
                Work_city                public synonym
                Plant_detail                public synonym

Jill                sal_limit                private synonym
                Work_city                public synonym
                Plant_detail                table owner

    考虑一下下列SQL语句能否在这两个用户之间共享.
   
SQL        能否共享        原因
select max(sal_cap) from sal_limit;        不能        每个用户都有一个private synonym - sal_limit , 它们是不同的对象
select count(*0 from work_city where sdesc like 'NEW%';        能        两个用户访问相同的对象public synonym - work_city
select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id        不能        用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.       
  
C.      两个SQL语句中必须使用相同的名字的绑定变量(bind variables)

例如:

第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)
a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;

b.
select pin , name from people where pin = :blk1.ot_ind;
select pin , name from people where pin = :blk1.ov_ind;                            


6.  总结
       不使用绑定变量是做着等死,使用绑定变量不一定不会死;没有任何的良药会包治百病,所以在如何合理有效地使用绑定变量仍就需要大家去摸索;

相关文献:
1. [Oracle 高级专家编程] 作者:Thomas Kytes  袁勤勇,张玉魁编译;清华大学出版社;
2. ORACLE SQL性能优化系列  from www.dbasupport.com
3. Oracle 绑定变量的用法   from 王者之剑(www.albertsong.com)
0
相关文章