继续之前关于共享游标的实验
接下来要说明的一个问题是关于子游标的共享,在sql的文本完全相同的情况下,产生的父游标可能被共享,而这时cursor能否被共享就取决于子游标能否共享了,与子游标相关的关键因素是执行环境.,而非sql_text,即sql文本
实验步骤如下
SQL> show parameter optimizer_mode;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode string FIRST_ROWS_10
SQL> select count(*) from t1;
COUNT(*)
----------
1001
SQL> alter system set optimizer_mode = all_rows;
System altered.
SQL> select count(*) from t1;
COUNT(*)
----------
1001
SQL> col sql_text format a25;
SQL> select sql_id, sql_text, child_number, optimizer_mode, plan_hash_value from v$sql where sql_id = (select prev_sql_id from v$session where sid = sys_context('userenv', 'sid'));
SQL_ID SQL_TEXT CHILD_NUMBER OPTIMIZER_ PLAN_HASH_VALUE
------------- ------------------------- ------------ ---------- ---------------
5bc0v4my7dvr5 select count(*) from t1 0 FIRST_ROWS 3724264953
5bc0v4my7dvr5 select count(*) from t1 1 ALL_ROWS 3724264953
SQL> select sql_id, optimizer_mode_mismatch from v$sql_shared_cursor where sql_id = '5bc0v4my7dvr5'
2 ;
SQL_ID O
------------- -
5bc0v4my7dvr5 N
5bc0v4my7dvr5 Y
由此得出了结论,在父游标共享的情况下(v$sql中的sql_id一致), 子游标由于出现了optimizer_mode的mismatch导致了不能共享。
而关于mismatch,在上一篇里面有了简单介绍,可以通过查看v$sql_shared_cursor来进行判断。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23527828/viewspace-680463/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23527828/viewspace-680463/