您的位置:首页 > 数据库 > SQL

2017-03-08 DBA日记,sql语句绑定变量及after logon database触发器的影响

2017-04-04 09:41 309 查看
手记一:

背景:今日有个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;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: