与父游标有关的关键信息是SQL语句的文本。多个SQL语句只有在它们的文本完全一样才可以共享同一个父游标。这里不考虑cursor_sharing参数。
select * from t where object_id = 1000;
select * FROM t where object_id = 1000;
select * from t where object_id = 1000;
select * from t WHERE object_id = 1000;
视图v$sqlarea,可以确认系统创建了3个不同的父游标,其执行次数不同。
SQL_ID SQL_TEXT EXECUTIONS
------------- -------------------------------------------------- ----------
8t5k201n7j72y select * from t where object_id = 1000 2
303xay3pk7ddn select * FROM t where object_id = 1000 1
48fhsdafh7q9q select * from t WHERE object_id = 1000 1
(2)父游标共享而子游标无法共享
与子游标有关的主要信息是执行计划与执行环境。
SQL> alter session set optimizer_mode = all_rows;
会话已更改。
SQL> select count(*) from t;
COUNT(*)
----------
11202
SQL> alter session set optimizer_mode = first_rows_10;
会话已更改。
SQL> select count(*) from t;
COUNT(*)
----------
11202
SQL> select sql_id, child_number, sql_text, optimizer_mode, plan_hash_value
2 from v$sql
3 where sql_id = (select prev_sql_id from v$session
4 where sid = sys_context('userenv', 'sid'));
SQL_ID CHILD_NUMBER SQL_TEXT OP
TIMIZER_ PLAN_HASH_VALUE
------------- ------------ -------------------------------------------------- --
-------- ---------------
cyzznbykb509s 0 select count(*) from t AL
L_ROWS 2966233522
cyzznbykb509s 1 select count(*) from t FI
RST_ROWS 2966233522
查询v$sql_shared_cursor可以得到哪种不匹配导致多个子游标的产生。
SQL> select child_number, optimizer_mode_mismatch
2 from v$sql_shared_cursor
3 where sql_id = 'cyzznbykb509s'
4 /
CHILD_NUMBER O
------------ -
0 N
1 Y
硬解析通常都是由不可共享的父游标,而不是由不可共享的子游标造成的。每个父游标一般只有少量子游标。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9523925/viewspace-1031787/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9523925/viewspace-1031787/