O evento 10046 é o SQL trace estendido do Oracle: o nível diz o que entra no arquivo além das chamadas ao banco. O WaitScope precisa das esperas. Use o nível 8; o 12 também serve, mas grava os valores de bind, que o WaitScope ignora.
Antes de começar
- O
alter session set eventsliga o evento só na sessão em que você está e pede o privilégioALTER SESSION. Para ligar em outra sessão, use o DBMS_MONITOR. - Confira antes os parâmetros que mudam o arquivo (timed_statistics e max_dump_file_size).
- Para achar o arquivo depois, dê um nome a ele com o
tracefile_identifier(marcar o nome do arquivo).
Os níveis
| Nível | O que grava | No WaitScope |
|---|---|---|
| 1 | O SQL trace comum: comandos, chamadas e linhas do plano | Não serve: sem esperas |
| 4 | O nível 1 e os valores de bind | Não serve: sem esperas |
| 8 | O nível 1 e as esperas | Recomendado |
| 12 | O nível 1, os binds e as esperas | Serve; os binds são ignorados |
Os níveis 1, 4, 8 e 12 estão na tabela Event Level Settings da página SQL Trace da documentação da Oracle, e o nível 8 é o que o guia de tracing do 19c usa para gravar as esperas. Sem as esperas, o perfil não separa a espera do resto: o tempo esperando disco, lock ou a aplicação vira tempo não contabilizado, dentro e entre as chamadas (lacunas entre chamadas). No Resumo, Esperas igual a 0 indica trace sem esperas.
Quando o plano vai para o arquivo
As linhas STAT, o plano com os números de cada operação, vão para o arquivo na frequência do parâmetro plan_stat. A referência do DBMS_MONITOR documenta três valores:
| Valor | Quando grava o plano | No relatório |
|---|---|---|
'FIRST_EXECUTION', igual a NULL, o padrão | Na primeira execução do cursor | O plano aparece no detalhe do comando. |
'ALL_EXECUTIONS' | A cada execução, e o arquivo cresce | Cada plano diferente aparece uma vez, com os números da última gravação (num comando com o selo N variantes, os da execução gravada mais demorada) e uma nota como plano gravado 3 vezes, mostrando o último (com variantes, mostrando o da gravação mais demorada). |
'NEVER' | Nunca | O detalhe do comando sai sem plano. |
No alter session set events, os níveis documentados, 1, 4, 8 e 12, não escolhem essa frequência, e o padrão já basta para o relatório mostrar o plano. Se precisar do plano a cada execução, ligue o trace pelo DBMS_MONITOR com plan_stat => 'ALL_EXECUTIONS' (que valores usar).
Ligar e desligar com ALTER SESSION
- Na sessão que vai rodar a operação, ligue o evento:
alter session set events '10046 trace name context forever, level 8'; - Rode a operação inteira nessa mesma sessão.
- Desligue o evento:
alter session set events '10046 trace name context off';
Resultado: o arquivo de trace da sessão tem as linhas PARSE, EXEC, FETCH e WAIT da operação. Para achar o caminho dele, use a consulta ao V$DIAG_INFO de achar o arquivo da própria sessão.
Não ligue o 10046 no sistema inteiro: cada sessão grava o seu arquivo, e a operação que interessa fica perdida entre os outros.
Parâmetros que mudam o arquivo
Confira os valores em vigor antes de ligar:
select name, value
from v$parameter
where name in ('timed_statistics', 'statistics_level', 'max_dump_file_size');
| Parâmetro | Valor bom | Fora dele |
|---|---|---|
timed_statistics | TRUE | Com FALSE, os tempos saem zerados e o perfil não tem o que dividir. Com statistics_level em TYPICAL ou ALL, o padrão dele é TRUE. |
max_dump_file_size | UNLIMITED, o padrão | Com limite, o arquivo para de crescer ao chegar nele. A partir de 25 MB, o Oracle divide o trace em até 5 segmentos e apaga o mais antigo depois do primeiro: o meio da operação some. |
Na sua sessão, ajuste com alter session:
alter session set timed_statistics = true;
alter session set max_dump_file_size = unlimited;
Na sessão de outra pessoa, ligada pelo DBMS_MONITOR, vale o valor da instância, que só muda com alter system e vale para todas as sessões: combine com o DBA. Os detalhes estão na referência da Oracle para MAX_DUMP_FILE_SIZE e TIMED_STATISTICS.
Trace cortado no meio
O relatório mede só o que está no arquivo. Sinais de que o trace não cobre a operação inteira:
- o Período do Resumo começa depois ou termina antes da operação;
- um aviso no alto do relatório que termina em (trace iniciado ou cortado no meio de uma chamada);
- comandos com Texto não disponível: o cursor foi aberto antes do início do trace.;
- o achado Lacunas de tempo entre chamadas no Diagnóstico.
Para evitar: ligue o trace antes de a operação começar e desligue depois do fim, sem desligar no meio; deixe o max_dump_file_size sem limite; e, se a aplicação trocar de arquivo no caminho, envie todos os arquivos juntos (analisar juntos).
Próximos passos
- Para ligar o trace em outra sessão: ligar o trace com o DBMS_MONITOR.
- Para achar o arquivo: achar o arquivo de trace.
- Para enviar: enviar pelo navegador.