Ajustando um dos métodos que estavam no post anterior sobre SQL Profiles, segue uma procedure para aplicar um profile, baseado num sql_id, para aplicar com sucesso, siga os passos abaixo:
- Tenha em mãos o SQLID “problemático”;
- Tenha em mãos o SQLID com as hints que encontraste para que a query tenha uma melhor performance;
- Execute a procedure: apply_sqlprofile(<sqlid problemático>,<sqlid melhorado>).
Código da procedure e grants necessários:
– grant select on v_$sql to daa;
– grant execute on dba_sqltune to <<user>>;
create or replace procedure apply_sqlprofile(
v_sql_id_from dba_hist_sqlstat.sql_id%type,
v_sql_id_to dba_hist_sqlstat.sql_id%type,
v_category varchar2 default ‘DEFAULT’)
is
v_time date;
ar_profile_hints sys.sqlprof_attr;
cl_sql_text clob;
begin
select sysdate into v_time
from dual;
select extractvalue(value(d), ‘/hint’) as outline_hints bulk collect into ar_profile_hints
from xmltable(‘/*/outline_data/hint’ passing (select xmltype(other_xml) as xmlval
from v$sql_plan
where
sql_id = v_sql_id_from
and child_number = 0
and other_xml is not null) ) d;
select sql_fulltext into cl_sql_text
from v$sql
where sql_id = v_sql_id_to
and child_number = 0;
dbms_sqltune.import_sql_profile(sql_text => cl_sql_text, profile => ar_profile_hints, category => v_category, name => ‘PROFILE_’||v_sql_id_to||’_attach’);
end;
/
Saudações Vascaínas ….