码迷,mamicode.com
首页 > 数据库 > 详细

Oracle绑定变量

时间:2014-05-07 00:58:05      阅读:418      评论:0      收藏:0      [点我收藏+]

标签:java   c   使用   table   res   不同的   

select * from table where id = ?

类似于上面这样的sql,如果不用绑定变量,每次执行时Oracle会认为是不同的sql,会在每次执行时生成一遍执行计划,而执行计划的生成是非常耗CPU,试想一下,如果1000个并发都在执行这条语句,等于同时在生成1000个执行计划。

 

如果使用了绑定变量,那么即使id的值在变化,Oracle也认为是同一个语句,只在第一次生成一遍执行计划,保存到共享池中。后面的999次执行都不需要再生成执行计划,直接用就可以。

 

CPU性能是一方面,另一方面,不使用绑定变量,后期还会导致更严重的问题,由于大量执行计划存入共享池,会把有限的内存占满,而这些执行计划又是很细碎的。把内存空间切得很碎,等到下次有大的语句需要保存到共享池时,即使空间足够,也会因为没有连续的空间而报错。

 

那么如何使用绑定变量,其实很简单,在Java里,就是使用PrepareStatement就可以了,其实大家都是这么用的,只是知道Oracle背后使用了绑定变量以及不用绑定变量的坏处的人不多。

 

但绑定变量也不是任何时候都可以用的,有些时候用绑定变量不一定好。

比如还是上面这个语句,当id=1时,假设table里id=1的只有一条,这时候的执行计划会选择走索引。

当id=2时,假设table里id=2的记录占到了90%,这时候显然是要走全表扫描。

但由于第二次执行不再生成执行计划,直接用了第一次执行时生成。这样id=2的时的查询性能会比较差。

不过这个问题在Oracle 11g得到了解决,在9i和10g还是存在。

即使如此,绑定变量也不能滥用。

Oracle绑定变量,布布扣,bubuko.com

Oracle绑定变量

标签:java   c   使用   table   res   不同的   

原文地址:http://www.cnblogs.com/attlia/p/3712491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!