适用场景:在无法将应用的代码修改为绑定变量情况下,oracle提供的一种解决方法。
注意:游标共享特性有个不太好的名声,就是它不是很稳定,过去数年,大量与之相关的bug被发现和确认。
游标共享之cursor_sharing=similar
游标共享之cursor_sharing=EXACT
下面来做个试验:
SQL> Drop table t purge;
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_optimizer_extended_cursor_sharing string UDO
cursor_sharing string EXACT
SQL> create table t as select * from dba_objects;
SQL> alter session set cursor_sharing=force;
SQL> alter system flush shared_pool;
SQL> select /*+test_force*/count(1) from t where object_id=100;
COUNT(1)
----------
1
SQL> select /*+test_force*/count(1) from t where object_id=100;
COUNT(1)
----------
1
SQL> select /*+test_force*/count(1) from t where object_id=200;
COUNT(1)
----------
1
SQL> col sql_text format a80;
----谓词不同的情况下只解析一次
SQL> select sql_id,child_number,sql_text from v$sql where sql_text like '%/*+test_force*/%'
2 and sql_text not like '%sql_text%';
SQL_ID CHILD_NUMBER SQL_TEXT
------------- ------------ --------------------------------------------------------------------------------
f3jksnvgk93w9 0 select /*+test_force*/count(:"SYS_B_0") from t where object_id=:"SYS_B_1"