前段时间有给学员上课的时候,有学员提出这么一个发生在生产环境上的问题,客户的数据库硬件是很不错的,内存有64G,其中20G给oracle数据库使用,数据库开始运行的时候查询挺快,但是运行一段时间时候,就变得很慢,cup的使用率一直很高,重新启动数据库,又恢复正常,经过分析发现,发现sql的命中率很低,大部分sql都做硬解析,损耗大量的缓存在存放sql和执行计划,并且做硬解析对cpu的负担也很大,类似这种情况,建议开发人员尽量修改sql,使用绑定变量,来提高性能,但是有时候去修改代码,时间上来不及,这个时候就需要采用一个折中的方法,就是将oracle的系统参数cursor_sharing的值修改成‘force’,下面用实例来演示这个参数的实际作用
1.第一步,将cursor_sharing的值修改为force
SQL> alter system set 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
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;
SQL> select empno,ename,sal from emp where empno=7369;
EMPNO ENAME SAL
---------- ------------------------------ ----------
7369 SMITH 800
---------- ------------------------------ ----------
7369 SMITH 800
SQL> select empno,ename,sal from emp where empno=7499;
EMPNO ENAME SAL
---------- ------------------------------ ----------
7499 ALLEN 1600
---------- ------------------------------ ----------
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,不会进行硬解析。
---------- ------------------------------ ----------
7521 WARD 1250
执行上述sql语句之后,使用select NAME,value from v$sysstat where name='parse count (hard)'查询,其硬解析的值依然是10207,这个就是将cursor_sharing的值为force 的作用,只要sql语句相同,不管谓词值是否相同,都会当成相同的sql,重用之前的cursor,不会进行硬解析。
转载于:https://blog.51cto.com/19880614/1140267