1.更改参数cursor_sharing
参数cursor_sharing决定了何种类型的SQL可以使用相同的SQL area
CURSOR_SHARING = { SIMILAR | EXACT | FORCE }
EXACT --只有当发布的SQL语句与缓存中的语句彻底相同时才用已有的执行计划。
FORCE --若是SQL语句是字面量,则迫使Optimizer始终使用已有的执行计划,不管已有的执行计划是否是最佳的。
SIMILAR --若是SQL语句是字面量,则只有当已有的执行计划是最佳时才使用它,若是已有执行计划不是最佳则从新对这个SQL
--语句进行分析来制定最佳执行计划。
能够基于不一样的级别来设定该参数,如ALTER SESSION, ALTER SYSTEM
sys@ASMDB> show parameter cursor_shar --查看参数cursor_sharing
NAME TYPE VALUE
cursor_sharing string EXACT
sys@ASMDB> alter system set cursor_sharing='similar'; --将参数cursor_sharing的值更改成similar
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
--当前硬解析的值为865
parse count (hard) 64 865
scott@ASMDB> select * from dept where deptno=10;
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
--执行上一条SQL查询后,硬解析的值变为866
parse count (hard) 64 866
scott@ASMDB> select * from dept where deptno=20;
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
--执行上一条SQL查询后,硬解析的值没有发生变化仍是866
parse count (hard) 64 866
sys@ASMDB> select sql_text,child_number from v$sql -- 在下面的结果中能够看到SQL_TEXT列中使用了绑定变量:"SYS_B_0"
2 where sql_text like 'select * from dept where deptno%';
SQL_TEXT CHILD_NUMBER
select * from dept where deptno=:"SYS_B_0" 0
sys@ASMDB> alter system set cursor_sharing='exact'; --将cursor_sharing改回为exact
--接下来在scott的session 中执行deptno=40 和的查询后再查看sql_text,当cursor_sharing改成exact后,每执行那个一次
--也会在v$sql中增长一条语句
sys@ASMDB> select sql_text,child_number from v$sql
2 where sql_text like 'select * from dept where deptno%';
SQL_TEXT CHILD_NUMBER
select * from dept where deptno=50 0
select * from dept where deptno=40 0
select * from dept where deptno=:"SYS_B_0" 0
注意当该参数设置为similar,会产生不利的影响,能够参考这里:cursor_sharing参数对于expdp的性能影响