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
Related posts
Disclaimer
Minhas postagens refletem minhas próprias opiniões e não representam necessariamente as opiniões do meu empregador, a Accenture.