Duas leituras completam o perfil: o mesmo tempo agrupado pela classe de espera do Oracle, que mostra de que tipo é a espera, e o tempo do SQL recursivo, que mostra quanto um comando gasta nos comandos que ele dispara.
O que a seção mostra
Logo abaixo do perfil, a tabela Por classe de espera soma os componentes pela classe do Oracle (wait_class), com a CPU e o tempo não contabilizado como classes próprias. A soma das linhas também é o tempo total. A classe de cada evento segue a v$event_name do Oracle 19c; os eventos gc ficam em Cluster, e evento que o WaitScope não sabe classificar fica em Não classificado.
| Classe | O que agrupa |
|---|---|
| Idle | A sessão esperando trabalho. Num trace de sessão, quase sempre é SQL*Net message from client: tempo da aplicação, da rede e do usuário. |
| Network | Dados mandados e recebidos pelo SQL*Net, com a aplicação ou com outro banco por dblink. |
| User I/O | Leituras e gravações de dados feitas pela própria sessão. |
| System I/O | I/O dos processos de fundo que a sessão esperou. |
| Commit | A gravação do redo no COMMIT (log file sync). |
| Application | Linha ou tabela presa por outra sessão, locks da própria aplicação, erros devolvidos. |
| Concurrency | Disputa por estruturas internas: latches, mutexes, buffers. |
| Configuration | Um limite de configuração: redo log, buffer cache, ITL, cache de sequence, espaço. |
| Scheduler | O Resource Manager segurando a sessão. |
| Cluster | Blocos e mensagens trocados entre as instâncias do RAC. |
| Administrative e Other | Comandos de administração e eventos internos sem classe mais específica. |
| CPU e Não contabilizado | Os componentes de CPU e os dois tempos não contabilizados do perfil. |
| Não classificado | Eventos que o WaitScope não sabe classificar. |
Como ler
| Coluna | O que diz |
|---|---|
| Classe | O nome da classe. Clique nele para abrir o cartão, com Normal quando, Preocupa quando e Onde olhar, como no perfil. |
| Duração (s) | A soma dos componentes da classe. |
| % do total | A parte do tempo total, com a barra ao lado. |
| Ocorrências | A soma das ocorrências dos componentes. Em branco em Não contabilizado. |
| Principais componentes | Os componentes que mais pesam na classe, na ordem do perfil. |
Para um evento em Não classificado, a classe dele no banco está na v$event_name:
select name, wait_class
from v$event_name
where name = 'nome do evento';
SQL recursivo
SQL recursivo é o comando que outro comando executa, e não a aplicação: o SQL dentro de funções e procedures PL/SQL, o de triggers e as consultas que o próprio banco faz ao dicionário. No trace, ele tem dep= maior que 0. O relatório mostra esse tempo em quatro lugares:
- Em Comandos SQL, a coluna Prof. é 0 no comando chamado pela aplicação e 1 ou mais no recursivo. O recursivo quase sempre tem contribuição zero: o tempo dele já está na chamada de nível 0 que o disparou. O tempo próprio dele está em Inclusivo (s).
- No detalhe do comando, o cartão Profundidade diz chamado pela aplicação ou SQL recursivo.
- No Perfil do comando, a linha SQL recursivo (comandos filhos), do tipo recursivo, soma a duração das chamadas que o comando disparou. O cartão dela diz que é normal num comando PL/SQL que executa outros SQL e que preocupa quando soma muito num SELECT ou DML simples: função PL/SQL chamada por linha, ou trigger pesado.
- No fim do detalhe, SQL recursivo executado por este comando lista os comandos filhos que mais demoraram, do que mais demorou para o que menos demorou, com link para o detalhe de cada um.
Em Comandos por componente, o tempo de cada componente fica no comando que o gastou: a leitura feita pelo SQL recursivo conta no comando filho, não no que o disparou.
Quando preocupa
Quando estas classes pesam no tempo total, o Diagnóstico mostra um achado próprio, de severidade média, com o link Ver perfil por classe. Os de Application, Concurrency e Commit sobem para alta quando a classe pesa muito.
| Classe | Achado |
|---|---|
| Application | Espera por bloqueio de outra sessão |
| Concurrency | Disputa por estruturas internas do banco |
| Commit | Muito tempo esperando a gravação do redo no commit |
| Configuration | Espera ligada à configuração do banco |
| Cluster | Troca de blocos entre instâncias do RAC |
| Scheduler | Sessão contida pelo Resource Manager |
| CPU | CPU domina o tempo de resposta |
No SQL recursivo, preocupa a linha SQL recursivo (comandos filhos) alta num comando simples e o comando recursivo executado milhares de vezes com uma linha por execução: é laço em PL/SQL (linha a linha em PL/SQL).
Para onde ir depois
- Tabela por classe do relatório de exemplo: Idle com 71,3% do tempo total, User I/O com 18,5%.
- Comando #1 do exemplo: no perfil do comando, a linha SQL recursivo (comandos filhos) soma 0,000390 s, e o filho aparece no fim. O comando #2 é esse filho, com profundidade 1.
- Comandos por componente e por classe, para ver quais comandos gastaram o tempo de cada classe.