前段时间有给学员上课的时候,有学员提出这么一个发生在生产环境上的问题,客户的数据库硬件是很不错的,内存有64G,其中20G给oracle数据库使用,数据库开始运行的时候查询挺快,但是运行一段时间时候,就变得很慢,cup的使用率一直很高,重新启动数据库,又恢复正常,经过分析发现,发现sql的命中率很低,大部分sql都做硬解析,损耗大量的缓存在存放sql和执行计划,并且做硬解析对cpu的负担也很大,类似这种情况,建议开发人员尽量修改sql,使用绑定变量,来提高性能,但是有时候去修改代码,时间上来不及,这个时候就需要采用一个折中的方法,就是将oracle的系统参数cursor_sharing的值修改成‘force’,下面用实例来演示这个参数的实际作用

1.第一步,将cursor_sharing的值修改为force

SQL> alter system set cursor_sharing='force';

Session altered.

2.第二步想查询一下系统的已经做过多少次硬解析

SQL> select NAME,value from v$sysstat where name='parse count (hard)';

NAME                                          VALUE

---------------------------------------- ----------

parse count (hard)                            10207

3.第三步使用一些sql语句来测试这个参数是否起作用

SQL> select empno,ename,sal from emp where empno=7369;

    EMPNO ENAME                                 SAL

---------- ------------------------------ ----------

     7369 SMITH                                 800

SQL> select empno,ename,sal from emp where empno=7499;

    EMPNO ENAME                                 SAL

---------- ------------------------------ ----------

     7499 ALLEN                                1600

SQL> select empno,ename,sal from emp where empno=7521;

    EMPNO ENAME                                 SAL

---------- ------------------------------ ----------

     7521 WARD                                 1250

执行上述sql语句之后,使用select NAME,value from v$sysstat where name='parse count (hard)'查询,其硬解析的值依然是10207,这个就是将cursor_sharing的值为force 的作用,只要sql语句相同,不管谓词值是否相同,都会当成相同的sql,重用之前的cursor,不会进行硬解析。


oracle视频教程请关注:http://down.51cto.com/4202939/up