3. SQL patch 以补丁的形式,将hint 打入到指定SQL

时间:2021-11-16 03:49:03

以补丁的形式,将hint 打入到指定SQL     也可以参考sqlt 下面的 ?coe_gen_sql_patch.sql   常用的HINT :   hint_text (一般是 bind_aware/monitor/)      注意: bind_aware/monitor /gather_plan_statistics  是sql  profile 是用不了的               如果 sql  profile 可以用的,建议用 sql  profile  

# 12.2之前版本
–需要用sys用户执行: sys.dbms_sqldiag_internal
–相关视图: DBA_SQL_PATCHES,hint 在description字段
–常用几个hint: GATHER_PLAN_STATISTICS / MONITOR / BIND_AWARE / IGNORE_OPTIM_EMBEDDED_HINTS

begin 
sys.dbms_sqldiag_internal.i_create_patch( sql_text  => V_SQL,
                                           hint_text => ‘BIND_AWARE‘,
                                           name      => ‘sql_djzfp4cy24dx3‘);
end ;
/

# 12.2及以后版本

#创建sql patch
declare 
  patch_name varchar2(30);
begin 
  patch_name:=dbms_sqldiag.create_sql_patch(sql_id=>‘&sql_id‘ , hint_text=>‘&hint_text‘);
end ;
/

注意:hint_text的写法,要体符合 Outline Data
可能选执行 explain plan for   hint 
然后通过display 的advanced 方式查询 , 注意要加引号 例: hint_text=>‘index("T"@"SEL$1")‘   或  ‘index(@"SEL$1" "T")‘
explain plan for select /*  index(t) */ OBJECT_NAME,OBJECT_TYPE from t where OBJECT_TYPE=‘JAVA CLASS‘;
select * from table(dbms_xplan.display(null,null,‘advanced‘)); 


#查看sql patch

col description format a40
col name format a30 
set linesize 200
select name,to_char(created,‘yyyy-mm-dd hh24:mi:ss‘) as created
,status,force_matching,description,substr(sql_text,1,50)  as sql_text
from dba_sql_patches 
order by created;


#删除sql patch 
exec  dbms_sqldiag.drop_sql_patch(name=>‘&patch_name‘)
    3. SQL patch 以补丁的形式,将hint 打入到指定SQL  

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">