Olá pessoal,

Tudo bem?

Em muitas aplicações, o código vem embutido com o deploy do fabricante do produto e não pode ser modificado.

Algumas vezes, o código original possui problemas de performance e uma potencial solução seria alterar o código ou adicionar hints para forçar um determinado caminho de acesso.

Quando o código não pode ser modificado, e, se você está passando por alguma crise de performance, você pode realizar o bypass utilizando SQL Patch. O SQL Patch permite que você insira hints no texto SQL que não poderia ser editado originalmente.

No post de hoje vou mostrar como criar um SQL Patch para um SQL_ID cuja query que possui o hint está no AWR.

Primeiro, vamos pegar o sql_text da query original:

var c clob
exec SELECT trim(sql_text) INTO :c FROM dba_hist_sqltext WHERE sql_id='1pzcw65khq4tu' AND rownum=1;

PL/SQL procedure successfully completed.

Agora, vamos pegar o sql_text da query que possui o hint, direto das views do AWR:

var h clob
exec SELECT -
listagg(hint,' ') within group(order by rownum) into :h -
FROM -
( -
SELECT -
b.hint -
FROM -
dba_hist_sql_plan m -
,xmltable ( -
'/other_xml/outline_data/hint' passing xmltype (m.OTHER_XML) columns hint clob PATH '/hint' -
) b -
WHERE -
TRIM( OTHER_XML ) IS NOT NULL -
AND sql_id = 'gs6gf69grvbbt' -
AND plan_hash_value = '2839797856' -
);

PL/SQL procedure successfully completed.

Por fim, vamos criar o SQL Patch para realizar o bypass do SQL para utilizar o hint:

var x varchar2(100);
begin
:X:=dbms_sqldiag_internal.I_CREATE_PATCH(SQL_TEXT => :C,HINT_TEXT => :h,CREATOR=>'SYS',NAME => '&SQLPATCH_NAME');
end;
/

PL/SQL procedure successfully completed.

A partir de agora, toda vez que a query original for executada, o banco de dados a substituirá pela query com hint.

Espero que seja útil.

Um abraço,

Vinicius