O detalhe de um comando junta tudo o que o trace diz sobre ele: o peso no tempo total, o texto, onde o tempo dele foi, as chamadas, o plano e os comandos que ele disparou.
O que a seção mostra
Clique no número ou no texto de um comando em qualquer lista do relatório, ou no link do achado que trata dele, como Ver comando #2. Na console, o detalhe abre numa página própria, com o caminho Análises / nome da análise / Comando #n. No HTML baixado, o detalhe existe para os comandos que aparecem em alguma lista ou achado e só é montado quando você clica: ele toma o lugar do relatório na página, e Voltar ao relatório ou o botão Voltar do navegador levam de volta à lista. No PDF, ele fica no fim, em Detalhe dos comandos.
O título traz a posição e o tipo do comando, como #1 · SELECT, com o sql_id e o hash value (hv). Numa forma, que soma comandos que só diferem nos literais, o título traz o selo N variantes no lugar deles, porque cada variante tem o seu (as variantes nas listas). Logo abaixo, os números:
- Peso no tempo total: a contribuição do comando, em segundos e em parte do tempo total (Comandos SQL);
- Inclusivo: a duração de todas as chamadas do comando;
- Profundidade: 0 com chamado pela aplicação, ou 1 ou mais com SQL recursivo. Numa forma, é a menor profundidade das variantes; quando ela é 0, o número vem com a menor entre as variantes;
- Erros: quantas linhas ERROR o cursor do comando teve, quando teve alguma (erros).
Depois vêm os blocos Texto, Variantes que mais gastaram (só numa forma), Perfil do comando, Chamadas, um Plano de execução para cada plano gravado (plano de execução) e SQL recursivo executado por este comando.
Como ler
Texto
O texto do comando como o trace gravou. Quando o plano tem operações em destaque, os objetos delas aparecem marcados no texto com o número da operação em destaque, e uma nota embaixo diz qual operação usa cada um. Num acesso por índice, a marca vai na tabela do índice, porque o índice não aparece no SQL. Quando o objeto não está no texto, a nota diz que ele vem de uma view, de um sinônimo ou de SQL recursivo.
Duas mensagens podem aparecer no lugar do texto ou abaixo dele: Texto não disponível: o cursor foi aberto antes do início do trace. e Texto cortado: o trace declara N caracteres., quando o texto guardado é menor que o declarado. Numa forma, o texto é o SQL com os literais trocados, e a nota Texto da forma: os literais viraram :s (texto) e :n (número). aparece embaixo.
Com a Privacidade dos relatórios ligada em Minha conta, o SQL sai com o texto entre aspas, os números usados como valor, ou os dois, trocados por ***, conforme as opções marcadas (literais escondidos).
Variantes que mais gastaram
Numa forma, a tabela lista as variantes que mais tempo gastaram nas próprias chamadas, da que mais gastou para a que menos gastou:
| Coluna | O que diz |
|---|---|
| SQL ID | O sql_id da variante ou, sem ele, o hash value, como hv 123. A coluna some quando nenhuma variante traz um nem outro. |
| Chamadas | Quantas chamadas a variante teve. |
| Inclusivo (s) | A duração de todas as chamadas da variante. |
| Literais | Os valores da variante, na ordem em que aparecem no texto, separados por vírgula: o que muda de uma variante para outra. |
Use os literais para achar na aplicação o trecho que monta o SQL e o SQL ID para procurar a variante no banco. Quando a contagem de variantes é estimada, as variantes que a análise não lembrou uma a uma ficam fora da tabela (trace com muitos comandos). Com a Privacidade dos relatórios ligada, os literais saem com *** conforme as opções marcadas, e a coluna SQL ID some com qualquer uma delas: o sql_id é calculado a partir do texto com os valores e permitiria descobrir o literal escondido.
Perfil do comando
O perfil exclusivo do comando: as esperas dentro das chamadas dele e entre elas no cursor dele, a CPU de cada tipo de chamada, o tempo não contabilizado dentro das chamadas e a linha SQL recursivo (comandos filhos), com a duração das chamadas que o comando disparou.
As colunas são Componente, Duração (s), % (a parte no tempo do próprio comando, e não no tempo total), a barra e Ocorrências. O nome de cada componente abre o mesmo cartão do perfil.
Chamadas
| Coluna | O que diz |
|---|---|
| Chamada | O tipo de chamada, na ordem do tkprof: PARSE, EXEC, FETCH, UNMAP, SORT UNMAP, CLOSE e os demais. |
| Quantidade | Quantas chamadas daquele tipo o comando teve. |
| CPU (s) e Duração (s) | A soma de c= e de e=, em segundos com seis casas. |
| Disco (PIO) | Blocos lidos do disco (p=). |
| Consistente (CR) | Leituras lógicas em modo consistente (cr=), as das consultas. |
| Corrente (CU) | Leituras lógicas em modo corrente (cu=), típicas de DML. |
| Linhas | Linhas devolvidas ou processadas (r=). |
| Misses | Falhas na library cache (mis=). No PARSE, cada miss é um hard parse. |
SQL recursivo executado por este comando
Os comandos filhos que mais demoraram, do que mais demorou para o que menos demorou, com #, Duração (s) e Texto. O número leva ao detalhe do filho quando ele está entre os comandos do relatório. Um filho que é uma forma traz o selo N variantes antes do texto.
Quando preocupa
- Peso no tempo total bem maior que o inclusivo: o tempo está entre as chamadas, e o perfil do comando mostra qual espera, quase sempre
SQL*Net message from client(sessão esperando a aplicação). - PARSE com Quantidade perto da de EXEC: o cursor é aberto e fechado a cada uso (um PARSE a cada execução). Misses perto da Quantidade do PARSE: hard parse (muitos hard parses).
- FETCH com Quantidade perto de Linhas: uma linha por chamada (muitos FETCH com poucas linhas).
- Consistente (CR) muito acima de Linhas: o plano lê blocos demais para o que devolve. Vá às operações em destaque do plano.
- A linha SQL recursivo (comandos filhos) pesa num SELECT ou DML simples: função chamada por linha ou trigger pesado (linha a linha em PL/SQL).
Para onde ir depois
- Comando #1 do relatório de exemplo: texto com a tabela T marcada, perfil com o SQL recursivo e o plano.
- Plano de execução, para achar a operação que gasta.
- Objetos, para ir da operação à tabela ou ao índice no banco.