Consultor Eletrônico



Kbase 50151: Consultar planos de execução em Oracle
Autor   Eloi Rene Pscheidt - CAT
Acesso   Público
Publicação   12/12/2014
O procedimento a seguir vai gerar um relatório contendo informações importantes sobre planos de execução de comandos que um determinado usuário tenha executado em base de dados Oracle.

Executar os seguintes passos na ferramenta SQL PLUS, conectando preferencialmente com o usuário SYS ou outro que tenha as seguintes permissões:
SELECT ANY DICTIONARY
GRANT EXECUTE ON dbms_output
GRANT EXECUTE ON dbms_xplan

Se o ambiente for cluster (Oracle RAC), precisa conectar na mesma instância onde reside a sessão que será monitorada (mesma inst_id).

Para descobrir o identificador da sessão (SADDR) que precisa ser analisada:
select saddr from v$session where username = 'SPORTS';
Alterar a cláusula where de acordo com a pesquisa desejada.

Com esse valor, executar a script 'mostra_planos' com a seguinte sintaxe:
@mostra_planos <saddr> <arquivo_saida_resultado>
Exemplo:
@c:\temp\mostra_planos.sql 388D3710 c:\temp\info_sports.txt

Enviar o arquivo gerado para nossa análise.

A seguir o conteúdo do script 'mostra_planos.sql', que deverá ser salvo no ambiente:
--Script mostra_planos.sql
set serveroutput on
set lines 120
set pages 100
spool '&2'
begin
for a in (select sql.sql_id, sql.child_number, sql.sorts, sql.executions, sql.rows_processed, sql.PHYSICAL_WRITE_BYTES, sp.temp_space, rownum
from v$open_cursor oc
inner join v$sql sql on sql.sql_id = oc.sql_id and sql.address = oc.address and sql.hash_value = oc.hash_value
inner join v$sql_plan sp on sp.sql_id = oc.sql_id and sp.address = oc.address and sp.hash_value = oc.hash_value
where oc.saddr = '&1') loop
dbms_output.put_line(chr(10));
dbms_output.put_line('P L A N O D E E X E C U C A O - ' || a.rownum);
dbms_output.put_line('SORTS='||a.sorts);
dbms_output.put_line('EXECS='||a.executions);
dbms_output.put_line('ROWS='||a.rows_processed);
dbms_output.put_line('PH WRITES='||a.physical_write_bytes);
dbms_output.put_line('TEMP=' || a.temp_space);
for c in (select PLAN_TABLE_OUTPUT from table(dbms_xplan.display_cursor(sql_id=>a.sql_id, cursor_child_no => a.child_number, format => 'all'))) loop
dbms_output.put_line(c.PLAN_TABLE_OUTPUT);
end loop;
end loop;
end;
/
spool off