oracle游标为什么没有共享,统计一下原因
-- Script Code为什么没共享
define sql_id = 'bs391f0yq5tpw';
set serveroutput on
DECLARE
v_count number;
v_sql varchar2(500);
v_sql_id varchar2(30) := '&sql_id';
BEGIN
v_sql_id := lower(v_sql_id);
dbms_output.put_line(chr(13)||chr(10));
dbms_output.put_line('sql_id: '||v_sql_id);
dbms_output.put_line('------------------------');
FOR c1 in
(select column_name
from dba_tab_columns
where table_name ='V_$SQL_SHARED_CURSOR'
and column_name not in ('SQL_ID', 'ADDRESS', 'CHILD_ADDRESS', 'CHILD_NUMBER', 'REASON', 'CON_ID')
order by column_id)
LOOP
v_sql := 'select count(*) from V_$SQL_SHARED_CURSOR
where sql_id='||''''||v_sql_id||''''||'
and '||c1.column_name||'='||''''||'Y'||'''';
execute immediate v_sql into v_count;
IF v_count > 0
THEN
dbms_output.put_line(' - '||rpad(c1.column_name,30)||' count: '||v_count);
END IF;
END LOOP;
END;
/
很清晰了,绑定变量不匹配
BIND_MISMATCH:绑定元数据与现有的子游标不匹配
ROLL_INVALID_MISMATCH:超过了滚动无效窗口。这是由DBMS_STATS的滚动无效功能引起的。因为它的无效窗口已经超过了,所以子游标不能被共享
BIND_LENGTH_UPGRADEABLE:绑定长度可升级,并且无法共享,因为一个绑定变量大小小于正在插入的新值(在早期版本中被标记为BIND_MISMATCH)。