手记一:
背景:今日有个DBA的同事和我说一个关于sql语句写法导致硬解释的case ,特滋记录
过程:
当cursor_sharing=force 时,如下sql语句是不会重用执用执行计划的:
SQL1:
select name --不需要显示全部字段
from author
where id=1;
SQL2:
select name --不需要显示全部字段
from author
where id=2;
SQL1和SQL2不能共享执行计划,原因是触发了oracle的 bug:Bug 9488694 : QUERY USING A SUBQUERY FACTORING CLAUSE SHOWS A DIFFERENT SIGNATURE.
验证:select sql_text,force_matching_signature from v$sqlarea where sql_text like '%不需要显示全部字段%'
返回的:,force_matching_signature 结果不一致。
CASE2:
当cursor_sharing=force 时,如下sql语句是不会重用执用执行计划的:
SQL1:
select name
from author
where id=1;
SQL2:
select name
from author
where id=2;
没有注释的情况下,同样的语句是能共享解释计划的。
CASE3:
当cursor_sharing=force 时,当使用显示绑定变量的方式,不管是否存在注释都能共享执行计划,也就是说软解释。
declare
v_sql varchar2(300);
v_id varchar2(300);
v_full_name varchar2(300);
begin
v_sql:='--aa '||chr(10)||'select /*+ qqt */full_name from author where id=:1';
v_dealer_no:='333924378';
execute immediate v_sql into v_full_name using v_id ;
DBMS_OUTPUT.PUT_LINE(v_full_name);
end;
/