Oracle硬解析與軟解析:編碼硬解析的改進方法

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的性能影響
相關文章
相關標籤/搜索