TRACE PL/SQL (da forma simples)

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Sáb, 09 Fev 2019 2:46 pm

Não vamos comentar sobre o comportamento de um Banco de Dados Oracle (Parse, Execute, Fetch), mas o trivial de um programador que mesmo com o debug do Oracle SQL Developer não sabe explicar qual ou quais packs, procedures e/ou functions estão onerando um processamento: primeiro passo medir tempo de execução dos objetos PL/SQL.

Nem pensar em implementar um DBMS_MONITOR.SESSION_TRACE_ENABLE, utilizar V$SESSION e utilitário TKPROF, exige muita "queima de pestanas", vamos utilizar algo mais simples.

Código: Selecionar todos
BEGIN
  who_trace_me (dados_inteligentes, quantidade_interações);
    select COLUNA_X into v_nome from TABELA_X when COLUNA_Y = VARIAVEL_Z;
    ...
   commit;
   who_trace_me (v_nome, qifeitas);
END


Bem simples; isso mesmo; bastou inserir a função WHO_TRACE_ME logo após o BEGIN e inserir WHO_TRACE_ME antes do END e temos o registro das informações na TABELA SYS_TRACE. Note que além do OWNER.OBJETO "em trace" teremos também o OWNER.OBJETO ORIGINADOR (CHAMADOR DO "em trace").

Não fique preocupado com sua base de dados, a WHO_TRACE_ME é um PRAGMA AUTONOMOUS_TRANSACTION não interfere na lógica da sua aplicação.

Por DEFAULT a GLOBAL PACK_SYS_TRACE.EXECUTA_SYS_TRACE_LOGICAL BOOLEAN := FALSE;

Desta forma caso deseje EXECUTAR o trace coloque esta BOOLEAN para TRUE no início da sua aplicação, ou em qualquer outro ponto onde desejar ativar (TRUE) ou desligar (FALSE) o trace. Este procedimento permitirá que mantenha as chamadas da WHO_TRACE_ME espalhadas em sua aplicação.

Como saber o tempo gasto pela SID (Session ID) 10 começando em 07/02/2019?

Código: Selecionar todos
select dtinicio, (dtinicio - lag(dtinicio) over(order by dtinicio,sys_trace_id)) as gasto,
called_traced_name, traced_name, traced_begin_end from sys_trace
where sid = 10 and (called_traced_name = 'TESTE' or traced_name = 'TESTE')
and dtinicio > to_date('06/02/19');


Código: Selecionar todos
07/02/19 17:57:48,727000000 (null)                        (null)  TESTE                 B
07/02/19 17:57:48,728000000 +00 00:00:00.001000 TESTE Z_GET_DIR_PATH B
07/02/19 17:57:58,729000000 +00 00:00:10.001000 TESTE Z_GET_DIR_PATH E
07/02/19 17:58:48,729000000 +00 00:00:50.000000 TESTE Z_GET_DIR_PATH B
07/02/19 18:57:48,730000000 +00 00:59:00.001000 TESTE Z_GET_DIR_PATH E
08/02/19 19:57:48,730000000 +01 01:00:00.000000 (null) TESTE                  E


Querendo maiores informações basta me contatar inbox. Abaixo segue link do arquivo script com todos os comandos para criar o ambiente e assim você testar e tirar dúvidas (leia as observações na procedure WHO_TRACE_ME.

https://1drv.ms/u/s!AthHN-eT3uCblm3Ifx-51EO4lyOZ
Renato Menezes Viana
Localização: Rio de Janeiro - RJ


Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Majestic-12 [Bot] e 7 visitantes

cron