前段时间有给学员上课的时候,有学员提出这么一个发生在生产环境上的问题,客户的数据库硬件是很不错的,内存有64G,其中20G给oracle数据库使用,数据库开始运行的时候查询挺快,可是运行一段时间时候,就变得很慢,cup的使用率一直很高,从新启动数据库,又恢复正常,通过分析发现,发现sql的命中率很低,大部分sql都作硬解析,损耗大量的缓存在存放sql和执行计划,而且作硬解析对cpu的负担也很大,相似这种状况,建议开发人员尽可能修改sql,使用绑定变量,来提升性能,可是有时候去修改代码,时间上来不及,这个时候就须要采用一个折中的方法,就是将oracle的系统参数cursor_sharing的值修改为‘force’,下面用实例来演示这个参数的实际做用sql
1.第一步,将cursor_sharing的值修改成force数据库
SQL> alter system set cursor_sharing='force';缓存
Session altered.oracle
2.第二步想查询一下系统的已经作过多少次硬解析ide
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