caso-1.trc
Sessão e ambiente
- Banco
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- Instância
- INST_01
- Servidor
- MAQ_01 · Linux · x86_64
- Sessão
- 151.464 · pid 79628
- Serviço
- SYS$USERS
- Módulo
- MOD_01
- Ação
- Unidade de tempo
- microssegundos
- Arquivo no servidor
- caso1.trc
Diagnóstico
Padrões que costumam explicar o que o trace mostra, em ordem de severidade. São pistas para a análise, não conclusões.
73,6% do tempo total (37,419 s) vem de um único componente. É por ele que a análise começa. Ver no perfil
Tempo entre chamadas de nível 0 sem espera registrada. O trace pode ter sido ligado e desligado no meio da sessão, ou o processo ficou parado fora do banco. Ver no perfil
SQL recursivo executado uma vez por linha, típico de laço em PL/SQL. Processamento em conjunto (um único SQL ou FORALL) costuma reduzir muito o tempo. Ver comando #1
SQL recursivo executado uma vez por linha, típico de laço em PL/SQL. Processamento em conjunto (um único SQL ou FORALL) costuma reduzir muito o tempo. Ver comando #2
Operação TABLE ACCESS FULL TAB_0005. Lê o objeto inteiro: confira se o filtro é seletivo e se há índice para ele. As operações estão destacadas no plano, no detalhe do comando. Ver no plano do comando #1
Operação TABLE ACCESS FULL TAB_0005. Lê o objeto inteiro: confira se o filtro é seletivo e se há índice para ele. As operações estão destacadas no plano, no detalhe do comando. Ver no plano do comando #2
O cursor é aberto e fechado a cada uso. Manter o cursor aberto na aplicação (cache de statements do driver) ou session_cached_cursors evita o PARSE repetido. Ver comando #1
O cursor é aberto e fechado a cada uso. Manter o cursor aberto na aplicação (cache de statements do driver) ou session_cached_cursors evita o PARSE repetido. Ver comando #2
A aplicação escreve os valores no texto do SQL em vez de usar bind variables, e cada valor diferente vira um comando novo para o banco. Os 1.217 PARSE das variantes, 1.217 deles hard parse, levaram 1,295 s (2,5% do tempo total); com todas as 3.651 chamadas e o SQL recursivo, as variantes somam 1,451 s. A correção é usar bind variables na aplicação. CURSOR_SHARING=FORCE no banco reduz os hard parses enquanto a aplicação não muda, mas é só paliativo. Ver comando #3
Perfil do tempo de resposta
Cada linha é uma parte do tempo total; somadas, dão 100%. Clique no nome de um componente ou de uma classe para ver o que esse tempo significa, quando ele é normal, quando indica problema e onde conferir no relatório. Tempo não contabilizado é o que o trace não explica por CPU nem por espera: dentro das chamadas, costuma ser fila de CPU ou código sem instrumentação; o valor negativo vem da granularidade da medida de CPU.
| Componente | Duração (s) | % do total | gráfico | Ocorrências | Média (s) | Mín (s) | Máx (s) |
|---|---|---|---|---|---|---|---|
| não contabilizado | 37,419211 | 73,6 | |||||
| cpu | 5,125233 | 10,1 | 180.117 | 0,000028 | 0,000000 | 0,008999 | |
| cpu | 4,550304 | 9,0 | 178.460 | 0,000025 | 0,000000 | 0,008999 | |
| cpu | 2,189671 | 4,3 | 180.269 | 0,000012 | 0,000000 | 0,124981 | |
| User I/O | 1,047610 | 2,1 | 1.962 | 0,000534 | 0,000005 | 0,035303 | |
| cpu | 0,255954 | 0,5 | 180.268 | 0,000001 | 0,000000 | 0,001999 | |
| User I/O | 0,165164 | 0,3 | 18.337 | 0,000009 | 0,000003 | 0,018484 | |
| não contabilizado | 0,055133 | 0,1 | 719.114 | 0,000000 | |||
| Application | 0,014392 | 0,0 | 1 | 0,014392 | 0,014392 | 0,014392 | |
| User I/O | 0,008094 | 0,0 | 3 | 0,002698 | 0,001960 | 0,003773 | |
| Idle | 0,001212 | 0,0 | 2 | 0,000606 | 0,000489 | 0,000723 | |
| Other | 0,000616 | 0,0 | 3 | 0,000205 | 0,000005 | 0,000385 | |
| User I/O | 0,000524 | 0,0 | 10 | 0,000052 | 0,000023 | 0,000082 | |
| Network | 0,000007 | 0,0 | 2 | 0,000003 | 0,000003 | 0,000004 | |
| Total | 50,833125 | 100,0 | |||||
Por classe de espera
Os mesmos componentes agrupados pela classe de espera do Oracle (wait_class), com CPU e tempo não contabilizado à parte. A soma também é o tempo total.
| Classe | Duração (s) | % do total | gráfico | Ocorrências | Principais componentes |
|---|---|---|---|---|---|
| 37,474344 | 73,7 | tempo não contabilizado entre chamadas · tempo não contabilizado dentro das chamadas | |||
| 12,121162 | 23,8 | 719.114 | CPU: PARSE dbcalls · CPU: FETCH dbcalls · CPU: EXEC dbcalls · CPU: CLOSE dbcalls | ||
| 1,221392 | 2,4 | 20.312 | db file sequential read · direct path read · local write wait · Disk file operations I/O | ||
| 0,014392 | 0,0 | 1 | enq: RO - fast object reuse | ||
| 0,001212 | 0,0 | 2 | SQL*Net message from client | ||
| 0,000616 | 0,0 | 3 | reliable message | ||
| 0,000007 | 0,0 | 2 | SQL*Net message to client |
Principais comandos por componente e por classe
Quanto cada comando gastou em cada componente do perfil e em cada classe de espera, pelo perfil exclusivo do comando (sem o SQL recursivo que ele dispara). Até 10 comandos por lista: mude no topo da página.
Por componente do perfil
CPU: PARSE dbcalls cpu5,125 s · 10,1% do tempo total · 10 comandos
CPU: FETCH dbcalls cpu4,550 s · 9,0% do tempo total · 10 de 12 comandos
Mais 2 comandos gastaram nele; aumente o número no topo da página para ver.
CPU: EXEC dbcalls cpu2,190 s · 4,3% do tempo total · 10 de 29 comandos
Mais 19 comandos gastaram nele; aumente o número no topo da página para ver.
db file sequential read espera1,048 s · 2,1% do tempo total · 10 de 23 comandos
Mais 13 comandos gastaram nele; aumente o número no topo da página para ver.
CPU: CLOSE dbcalls cpu0,256 s · 0,5% do tempo total · 3 comandos
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 2 | 0,130972 | 51,2 | 49 variantes SELECT (SELECT COL_0075 FROM TAB_0005 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0075 FROM DUAL | ||
| 1 | 0,123982 | 48,4 | 49 variantes SELECT (SELECT COL_0073 FROM TAB_0005 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0073 FROM DUAL | ||
| 8 | 0,001000 | 0,4 | 350 variantes INSERT INTO TAB_0001 (COL_0076,COL_0077, … :s,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL… |
direct path read espera0,165 s · 0,3% do tempo total · 1 comando
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 4 | 0,066395 | 40,2 | 9sxjs1fk1qc9g | BEGIN ROT_0001('***',*** ); END; |
tempo não contabilizado dentro das chamadas não contabilizado0,055 s · 0,1% do tempo total · 10 de 41 comandos
Mais 31 comandos gastaram nele; aumente o número no topo da página para ver.
enq: RO - fast object reuse espera0,014 s · 0,0% do tempo total · 1 comando
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 10 | 0,014392 | 100,0 | 9y5d9x2wwc9nn | TRUNCATE TABLE TAB_0005 |
local write wait espera0,008 s · 0,0% do tempo total · 1 comando
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 10 | 0,008094 | 100,0 | 9y5d9x2wwc9nn | TRUNCATE TABLE TAB_0005 |
SQL*Net message from client espera0,001 s · 0,0% do tempo total · 2 comandos
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 6 | 0,000723 | 59,7 | #140548883950424 | ||
| 5 | 0,000489 | 40,3 | 68ngguy15jsj7 | alter session set events='***' |
Por classe de espera
Não contabilizado37,474 s · 73,7% do tempo total · 10 de 41 comandos
Mais 31 comandos gastaram nele; aumente o número no topo da página para ver.
CPU12,121 s · 23,8% do tempo total · 10 de 38 comandos
Mais 28 comandos gastaram nele; aumente o número no topo da página para ver.
User I/O1,221 s · 2,4% do tempo total · 10 de 24 comandos
Mais 14 comandos gastaram nele; aumente o número no topo da página para ver.
Application0,014 s · 0,0% do tempo total · 1 comando
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 10 | 0,014392 | 100,0 | 9y5d9x2wwc9nn | TRUNCATE TABLE TAB_0005 |
Idle0,001 s · 0,0% do tempo total · 2 comandos
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 6 | 0,000723 | 59,7 | #140548883950424 | ||
| 5 | 0,000489 | 40,3 | 68ngguy15jsj7 | alter session set events='***' |
Other0,001 s · 0,0% do tempo total · 1 comando
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 10 | 0,000616 | 100,0 | 9y5d9x2wwc9nn | TRUNCATE TABLE TAB_0005 |
Network0,000 s · 0,0% do tempo total · 2 comandos
| # | Tempo (s) | % do total | gráfico | SQL ID | Texto |
|---|---|---|---|---|---|
| 6 | 0,000004 | 57,1 | #140548883950424 | ||
| 5 | 0,000003 | 42,9 | 68ngguy15jsj7 | alter session set events='***' |
Comandos SQL por contribuição
Contribuição: duração das chamadas de nível 0 do comando somada às esperas entre chamadas no cursor dele. Inclusivo: soma de todas as chamadas do comando, em qualquer profundidade.
| # | Contribuição (s) | % do total | Inclusivo (s) | Tipo | Prof. | Exec | Fetch | Linhas | LIO | PIO | SQL ID | Texto |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1,415 | 2,8 | 4,941 | SELECT | 1 | 89.112 | 89.112 | 89.112 | 445.560 | 0 | 49 variantes SELECT (SELECT COL_0073 FROM TAB_0005 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0073 FROM DUAL | |
| 2 | 1,405 | 2,8 | 4,842 | SELECT | 1 | 89.112 | 89.112 | 89.112 | 445.560 | 0 | 49 variantes SELECT (SELECT COL_0075 FROM TAB_0005 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0075 FROM DUAL | |
| 3 | 0,623 | 1,2 | 1,451 | INSERT | 1 | 1.217 | 0 | 1.217 | 8.761 | 32 | 1.217 variantes INSERT INTO TAB_0001 (COL_0076,COL_0077, … NULL,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,NULL,NULL,NULL,NULL… | |
| 4 | 0,137 | 0,3 | 0,070 | PL/SQL | 0 | 0 | 0 | 0 | 24 | 8 | 9sxjs1fk1qc9g | BEGIN ROT_0001('***',*** ); END; |
| 5 | 0,040 | 0,1 | 0,040 | ALTER SESSION | 0 | 1 | 0 | 0 | 0 | 0 | 68ngguy15jsj7 | alter session set events='***' |
| 6 | 0,027 | 0,1 | 0,026 | ? | 0 | 1 | 0 | 0 | 0 | 0 | #140548883950424 | |
| 7 | 0,000 | 0,0 | 1,023 | DELETE | 1 | 2 | 0 | 0 | 3.740 | 1.870 | 42q0kx6suxhw2 | DELETE FROM TAB_0001 |
| 8 | 0,000 | 0,0 | 0,417 | INSERT | 1 | 350 | 0 | 350 | 2.590 | 18 | 350 variantes INSERT INTO TAB_0001 (COL_0076,COL_0077, … :s,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL… | |
| 9 | 0,000 | 0,0 | 0,288 | INSERT | 1 | 251 | 0 | 251 | 1.800 | 5 | 251 variantes INSERT INTO TAB_0001 (COL_0076,COL_0077, … NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,… | |
| 10 | 0,000 | 0,0 | 0,082 | TRUNCATE TABLE | 1 | 1 | 0 | 0 | 110 | 17 | 9y5d9x2wwc9nn | TRUNCATE TABLE TAB_0005 |
As linhas marcadas com variantes somam comandos que só diferem nos literais; no texto, :s e :n ocupam o lugar dos literais.
Mostrando 10 de 65 comandos; aumente o número no topo da página para ver mais.
Tempo não atribuído a nenhum comando: 47,186 s.
Tipos de chamada
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 180.117 | 5,140 | 5,156 | 19 | 126 | 1 | 0 | 1.920 |
| FETCH | 178.460 | 4,550 | 4,726 | 28 | 893.297 | 0 | 178.432 | 0 |
| EXEC | 180.269 | 2,212 | 3,245 | 1.940 | 5.703 | 11.363 | 1.878 | 1 |
| CLOSE | 180.268 | 0,256 | 0,250 | 0 | 0 | 0 | 0 | 0 |
Chamadas de nível 0 mais longas
| Chamada | Duração (s) | CPU (s) | Início (+s) | Linha | LIO | PIO | Linhas | Comando |
|---|---|---|---|---|---|---|---|---|
| PARSE | 0,070229 | 0,010998 | 0,068 | 101 | 24 | 8 | 0 | #4 BEGIN ROT_0001('***',*** ); END; |
| EXEC | 0,039483 | 0,002000 | 0,028 | 36 | 0 | 0 | 0 | #5 alter session set events='***' |
| EXEC | 0,025924 | 0,001000 | 0,000 | 27 | 0 | 0 | 0 | #6 #140548883950424 |
| PARSE | 0,000157 | 0,000000 | 0,027 | 35 | 0 | 0 | 0 | #5 alter session set events='***' |
| CLOSE | 0,000014 | 0,000000 | 0,068 | 39 | 0 | 0 | 0 | #5 alter session set events='***' |
| CLOSE | 0,000010 | 0,000000 | 0,027 | 30 | 0 | 0 | 0 | #6 #140548883950424 |
Distribuição de latência
Faixas em potências de 10, por evento de espera e por tipo de chamada. Mostra se o tempo vem de muitas ocorrências rápidas ou de poucas lentas.
db file sequential read1.962 ocorrências · 1,048 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 921 | 46,9 | 0,007373 | 0,7 | |
| 10 µs ≤ e < 100 µs | 792 | 40,4 | 0,013459 | 1,3 | |
| 100 µs ≤ e < 1 ms | 138 | 7,0 | 0,063020 | 6,0 | |
| 1 ms ≤ e < 10 ms | 81 | 4,1 | 0,492727 | 47,0 | |
| 10 ms ≤ e < 100 ms | 30 | 1,5 | 0,471031 | 45,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
direct path read18.337 ocorrências · 0,165 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 15.931 | 86,9 | 0,088894 | 53,8 | |
| 10 µs ≤ e < 100 µs | 2.399 | 13,1 | 0,031524 | 19,1 | |
| 100 µs ≤ e < 1 ms | 3 | 0,0 | 0,000871 | 0,5 | |
| 1 ms ≤ e < 10 ms | 2 | 0,0 | 0,012198 | 7,4 | |
| 10 ms ≤ e < 100 ms | 2 | 0,0 | 0,031677 | 19,2 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
enq: RO - fast object reuse1 ocorrências · 0,014 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 µs ≤ e < 100 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 µs ≤ e < 1 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 ms ≤ e < 10 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 ms ≤ e < 100 ms | 1 | 100,0 | 0,014392 | 100,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
local write wait3 ocorrências · 0,008 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 µs ≤ e < 100 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 µs ≤ e < 1 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 ms ≤ e < 10 ms | 3 | 100,0 | 0,008094 | 100,0 | |
| 10 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
SQL*Net message from client2 ocorrências · 0,001 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 µs ≤ e < 100 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 µs ≤ e < 1 ms | 2 | 100,0 | 0,001212 | 100,0 | |
| 1 ms ≤ e < 10 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
reliable message3 ocorrências · 0,001 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 1 | 33,3 | 0,000005 | 0,8 | |
| 10 µs ≤ e < 100 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 µs ≤ e < 1 ms | 2 | 66,7 | 0,000611 | 99,2 | |
| 1 ms ≤ e < 10 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
Disk file operations I/O10 ocorrências · 0,001 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 µs ≤ e < 100 µs | 10 | 100,0 | 0,000524 | 100,0 | |
| 100 µs ≤ e < 1 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 ms ≤ e < 10 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
SQL*Net message to client2 ocorrências · 0,000 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 2 | 100,0 | 0,000007 | 100,0 | |
| 10 µs ≤ e < 100 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 µs ≤ e < 1 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 ms ≤ e < 10 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
PARSE (duração e da chamada)180.117 ocorrências · 5,156 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 5 | 0,0 | 0,000035 | 0,0 | |
| 10 µs ≤ e < 100 µs | 178.111 | 98,9 | 3,000978 | 58,2 | |
| 100 µs ≤ e < 1 ms | 1.275 | 0,7 | 1,125226 | 21,8 | |
| 1 ms ≤ e < 10 ms | 722 | 0,4 | 0,910699 | 17,7 | |
| 10 ms ≤ e < 100 ms | 4 | 0,0 | 0,118877 | 2,3 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
FETCH (duração e da chamada)178.460 ocorrências · 4,726 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 78 | 0,0 | 0,000438 | 0,0 | |
| 10 µs ≤ e < 100 µs | 178.059 | 99,8 | 4,514086 | 95,5 | |
| 100 µs ≤ e < 1 ms | 303 | 0,2 | 0,048463 | 1,0 | |
| 1 ms ≤ e < 10 ms | 14 | 0,0 | 0,062255 | 1,3 | |
| 10 ms ≤ e < 100 ms | 6 | 0,0 | 0,100307 | 2,1 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
EXEC (duração e da chamada)180.269 ocorrências · 3,245 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 118.350 | 65,7 | 0,977253 | 30,1 | |
| 10 µs ≤ e < 100 µs | 59.907 | 33,2 | 0,785548 | 24,2 | |
| 100 µs ≤ e < 1 ms | 1.991 | 1,1 | 0,262669 | 8,1 | |
| 1 ms ≤ e < 10 ms | 16 | 0,0 | 0,046673 | 1,4 | |
| 10 ms ≤ e < 100 ms | 4 | 0,0 | 0,155844 | 4,8 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 1 | 0,0 | 1,017115 | 31,3 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
CLOSE (duração e da chamada)180.268 ocorrências · 0,250 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 1 µs | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 µs ≤ e < 10 µs | 179.926 | 99,8 | 0,240244 | 96,0 | |
| 10 µs ≤ e < 100 µs | 338 | 0,2 | 0,008739 | 3,5 | |
| 100 µs ≤ e < 1 ms | 4 | 0,0 | 0,001227 | 0,5 | |
| 1 ms ≤ e < 10 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < 10 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 10 s ≤ e < 100 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 s ≤ e < 1.000 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1.000 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
Leituras
leituras (faixas de disco)20.299 ocorrências · 1,213 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 5 ms | 20.208 | 99,6 | 0,269748 | 22,2 | |
| 5 ms ≤ e < 10 ms | 59 | 0,3 | 0,440318 | 36,3 | |
| 10 ms ≤ e < 15 ms | 17 | 0,1 | 0,200554 | 16,5 | |
| 15 ms ≤ e < 20 ms | 10 | 0,0 | 0,171484 | 14,1 | |
| 20 ms ≤ e < 25 ms | 3 | 0,0 | 0,067689 | 5,6 | |
| 25 ms ≤ e < 50 ms | 2 | 0,0 | 0,062981 | 5,2 | |
| 50 ms ≤ e < 100 ms | 0 | 0,0 | 0,000000 | 0,0 | |
| 100 ms ≤ e < 1 s | 0 | 0,0 | 0,000000 | 0,0 | |
| 1 s ≤ e < ∞ | 0 | 0,0 | 0,000000 | 0,0 |
leituras (faixas de SSD)20.299 ocorrências · 1,213 s
| Faixa da duração | Ocorrências | % ocorr. | Duração (s) | % duração | |
|---|---|---|---|---|---|
| 0 ≤ e < 15 µs | 19.496 | 96,0 | 0,126062 | 10,4 | |
| 15 µs ≤ e < 25 µs | 295 | 1,5 | 0,005464 | 0,5 | |
| 25 µs ≤ e < 50 µs | 209 | 1,0 | 0,006839 | 0,6 | |
| 50 µs ≤ e < 100 µs | 43 | 0,2 | 0,002885 | 0,2 | |
| 100 µs ≤ e < 500 µs | 93 | 0,5 | 0,031763 | 2,6 | |
| 500 µs ≤ e < 1 ms | 48 | 0,2 | 0,032128 | 2,6 | |
| 1 ms ≤ e < 10 ms | 83 | 0,4 | 0,504925 | 41,6 | |
| 10 ms ≤ e < ∞ | 32 | 0,2 | 0,502708 | 41,5 |
Primeira leitura e releitura do mesmo bloco
Releitura frequente do mesmo bloco indica cache pequeno ou acesso repetido ao mesmo dado.
| Evento | Blocos distintos | 1ª leitura | 1ª leitura (s) | Releituras | Releituras (s) |
|---|---|---|---|---|---|
| db file sequential read | 1.956 | 1.956 | 1,048 | 6 | 0,000 |
| local write wait | 0 | 0 | 0,000 | 3 | 0,008 |
Objetos com mais tempo de espera
Pelo obj# das esperas. O nome vem das linhas STAT do próprio trace, quando existem.
| obj# | Nome | Espera (s) | Ocorrências | Eventos principais |
|---|---|---|---|---|
| 188047 | IDX_0001 | 0,931 | 1.877 | db file sequential read · Disk file operations I/O |
| 187750 | 0,165 | 18.336 | direct path read | |
| 1008999 | TAB_0005 | 0,023 | 17 | enq: RO - fast object reuse · local write wait · reliable message |
| 226 | IDL_CHAR$ | 0,017 | 1 | db file sequential read |
| 107 | I_DEPENDENCY2 | 0,016 | 1 | db file sequential read |
| 227 | IDL_UB2$ | 0,016 | 1 | db file sequential read |
| 427 | IDX_0012 | 0,010 | 1 | db file sequential read |
| 228 | IDL_SB4$ | 0,009 | 1 | db file sequential read |
| 31 | CDEF$ | 0,008 | 2 | db file sequential read |
| 19 | IND$ | 0,008 | 3 | db file sequential read |
| 237 | I_IDL_CHAR1 | 0,007 | 1 | db file sequential read |
| 236 | I_IDL_UB11 | 0,007 | 1 | db file sequential read |
| 187694 | 0,006 | 49 | db file sequential read | |
| 40 | I_OBJ5 | 0,005 | 1 | db file sequential read |
| 225 | IDL_UB1$ | 0,004 | 1 | db file sequential read |
| 464 | IDX_0008 | 0,003 | 1 | db file sequential read |
| 384 | 0,001 | 4 | SQL*Net message from client · SQL*Net message to client | |
| 650598 | 0,000 | 2 | db file sequential read · Disk file operations I/O | |
| 187749 | TAB_0002 | 0,000 | 2 | db file sequential read |
| 239 | I_IDL_SB41 | 0,000 | 1 | db file sequential read |
| 3 | I_OBJ# | 0,000 | 1 | db file sequential read |
| 54 | I_CDEF2 | 0,000 | 2 | db file sequential read |
| 18 | OBJ$ | 0,000 | 2 | db file sequential read |
| 187751 | 0,000 | 2 | db file sequential read · direct path read | |
| 462 | IDX_0007 | 0,000 | 1 | db file sequential read |
| 188088 | IDX_0002 | 0,000 | 1 | db file sequential read |
| 39 | I_OBJ4 | 0,000 | 1 | db file sequential read |
| 238 | I_IDL_UB21 | 0,000 | 1 | db file sequential read |
| 9 | I_FILE#_BLOCK# | 0,000 | 1 | db file sequential read |
| 57 | I_CCOL1 | 0,000 | 1 | db file sequential read |
Textos compartilháveis
Comandos que só diferem em literais. Com bind variables, um único cursor serviria a todos e os PARSE com hard parse cairiam.
| Textos | PARSE | PARSE (s) | Total (s) | SQL IDs | Exemplo |
|---|---|---|---|---|---|
| 49 | 89.112 | 1,568 | 4,941 | ocultos pela máscara | #1 SELECT (SELECT COL_0073 FROM TAB_0005 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0073 FROM DUAL |
| 49 | 89.112 | 1,573 | 4,842 | ocultos pela máscara | #2 SELECT (SELECT COL_0075 FROM TAB_0005 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0075 FROM DUAL |
| 1.217 | 1.217 | 1,295 | 1,451 | ocultos pela máscara | #3 INSERT INTO TAB_0001 (COL_0076,COL_0077, … NULL,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,NULL,NULL,NULL,NULL… |
| 350 | 350 | 0,373 | 0,417 | ocultos pela máscara | #8 INSERT INTO TAB_0001 (COL_0076,COL_0077, … :s,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL… |
| 251 | 251 | 0,256 | 0,288 | ocultos pela máscara | #9 INSERT INTO TAB_0001 (COL_0076,COL_0077, … NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,… |
| 2 | 3 | 0,000 | 0,000 | ocultos pela máscara | #60 select SYS_CONTEXT(:s,:s) from dual |
Tempo não contabilizado entre chamadas
tempo não contabilizado entre chamadas
Tempo entre o fim de uma chamada de nível 0 e o início da próxima sem nenhuma espera registrada. É a diferença entre o tempo total e a soma das chamadas e das esperas entre elas.
- Normal quando
- Pequeno: frações de milissegundo por chamada.
- Preocupa quando
- Soma muito: o trace foi ligado ou desligado no meio, o processo ficou fora da CPU (servidor saturado), a aplicação demorou sem a espera de cliente aparecer, ou falta arquivo da coleta.
- Onde olhar
- Período do trace e lacunas grandes de tempo: Resumo, Período
- Em coleta, se todos os arquivos vieram: Coleta, arquivos e sessões
- Chamadas separadas por lacunas: Chamadas de nível 0 mais longas
CPU nas chamadas PARSE
CPU: PARSE dbcalls
Tempo de CPU da sessão na análise do SQL (parse). Alto: hard parse por SQL sem bind, ou parse repetido do mesmo cursor (abrir e fechar a cada execução).
- Normal quando
- É parte do trabalho normal do banco.
- Preocupa quando
- Domina o tempo total: comece pelos comandos que mais gastam CPU e pelas leituras lógicas deles.
- Onde olhar
- Hard parses: Tipos de chamada, linha PARSE: Quantidade e Misses
- Comandos que só mudam os literais: Textos compartilháveis
- PARSE a cada EXEC: detalhe do comando, Chamadas: PARSE em relação a EXEC
- Comandos que mais gastaram CPU nesta chamada: Principais comandos por componente, grupo desta chamada
CPU nas chamadas FETCH
CPU: FETCH dbcalls
Tempo de CPU da sessão na busca das linhas. Alto: leituras lógicas demais (LIO), em geral um plano que lê muito mais blocos do que as linhas devolvidas pedem.
- Normal quando
- É parte do trabalho normal do banco.
- Preocupa quando
- Domina o tempo total: comece pelos comandos que mais gastam CPU e pelas leituras lógicas deles.
- Onde olhar
- CPU por tipo de chamada: Tipos de chamada
- Comandos com mais leituras lógicas: Comandos SQL, colunas LIO e Linhas
- Comandos que mais gastaram CPU nesta chamada: Principais comandos por componente, grupo desta chamada
- Operações do plano com LIO próprio alto: detalhe do comando, Plano de execução: operações em destaque
CPU nas chamadas EXEC
CPU: EXEC dbcalls
Tempo de CPU da sessão na execução: DML, abertura do cursor e corpo de blocos PL/SQL. Alto em PL/SQL: lógica pesada ou SQL dentro de laço.
- Normal quando
- É parte do trabalho normal do banco.
- Preocupa quando
- Domina o tempo total: comece pelos comandos que mais gastam CPU e pelas leituras lógicas deles.
- Onde olhar
- CPU por tipo de chamada: Tipos de chamada
- Comandos com mais leituras lógicas: Comandos SQL, colunas LIO e Linhas
- Comandos que mais gastaram CPU nesta chamada: Principais comandos por componente, grupo desta chamada
- Comandos filhos dos blocos PL/SQL: detalhe do comando, SQL recursivo
Leitura de um bloco
db file sequential read
Lê um bloco do disco para o buffer cache: acesso por índice, à tabela via ROWID, a undo ou a cabeçalho de segmento.
- Normal quando
- Acesso por índice a poucos blocos, com média de 0,1 a 1 ms em SSD ou flash e de 5 a 10 ms em disco.
- Preocupa quando
- Muitas leituras: o plano lê blocos demais (índice pouco seletivo, NESTED LOOPS com muitas linhas). Média alta: armazenamento lento ou disputado.
- Onde olhar
- Quantas leituras e quanto dura cada uma: Perfil, linha deste componente: colunas Ocorrências e Média (s)
- Leituras lentas, ou muitas leituras rápidas: Distribuição de latência, tabela deste evento
- Objetos mais lidos: Objetos com mais tempo de espera
- Releitura dos mesmos blocos: Leituras, primeira leitura e releitura do mesmo bloco
- Comandos que mais leram: Principais comandos por componente, grupo deste evento
- Operações do plano que leem blocos demais: detalhe do comando, Plano de execução: operações em destaque
CPU nas chamadas CLOSE
CPU: CLOSE dbcalls
Tempo de CPU da sessão no fechamento do cursor. Quase sempre pequeno.
- Normal quando
- É parte do trabalho normal do banco.
- Preocupa quando
- Domina o tempo total: comece pelos comandos que mais gastam CPU e pelas leituras lógicas deles.
- Onde olhar
- CPU por tipo de chamada: Tipos de chamada
- Comandos com mais leituras lógicas: Comandos SQL, colunas LIO e Linhas
- Comandos que mais gastaram CPU nesta chamada: Principais comandos por componente, grupo desta chamada
- Comandos filhos dos blocos PL/SQL: detalhe do comando, SQL recursivo
Leitura direta para a PGA
direct path read
Lê blocos do disco direto para a memória da sessão, sem passar pelo buffer cache: full scan grande em série ou consulta paralela.
- Normal quando
- Leitura completa de tabela grande num processo de lote.
- Preocupa quando
- Aparece em tela de usuário ou dentro de laço: full scan grande repetido, tabela lida inteira para devolver poucas linhas.
- Onde olhar
- Comandos que mais leram: Principais comandos por componente, grupo deste evento
- Operações TABLE ACCESS FULL e quantas vezes executaram: detalhe do comando, Plano de execução: coluna Exec
- Objetos mais lidos: Objetos com mais tempo de espera
Tempo não contabilizado dentro das chamadas
tempo não contabilizado dentro das chamadas
Parte da duração da chamada (e=) que não é CPU (c=) nem espera registrada dentro dela.
- Normal quando
- Pequeno. Valor negativo vem da granularidade da medida de CPU, não de problema.
- Preocupa quando
- Soma muito: fila de CPU (mais processos prontos que núcleos), paginação de memória (swap) ou código sem instrumentação de espera.
- Onde olhar
- Chamadas em que o tempo some (duração muito acima de CPU mais esperas): Chamadas de nível 0 mais longas
- Comandos que mais carregam esse tempo: Principais comandos por componente, grupo deste evento
- Carga de CPU e memória livre do servidor no período, fora do relatório
Limpeza de buffers (TRUNCATE ou DROP)
enq: RO - fast object reuse
TRUNCATE ou DROP esperando o banco descartar os blocos do objeto que estão no buffer cache.
- Normal quando
- Soma pouco tempo.
- Preocupa quando
- TRUNCATE dentro de laço, ou buffer cache muito grande para varrer.
- Onde olhar
- Quantas ocorrências: Perfil, linha deste componente: coluna Ocorrências
- Comandos que mais esperaram: Principais comandos por componente, grupo deste evento
User I/O (leitura e escrita de dados)
User I/O
Leituras e gravações de dados feitas pela própria sessão.
- Normal quando
- Algum I/O sempre há, com média baixa por leitura.
- Preocupa quando
- Blocos demais (o plano lê mais do que precisa) ou tempo médio alto por leitura (armazenamento lento).
- Onde olhar
- Quais eventos de I/O pesam: Por classe de espera, linha desta classe: coluna Principais componentes
- Leituras lentas, ou muitas leituras rápidas: Distribuição de latência
- Objetos mais lidos: Objetos com mais tempo de espera
- Comandos que mais leram: Principais comandos por classe, grupo desta classe
- Operações do plano que leem blocos demais: detalhe do comando, Plano de execução: operações em destaque
Esperando a aplicação
SQL*Net message from client
A sessão terminou a chamada anterior e espera o próximo pedido da aplicação. É tempo da aplicação, da rede e do usuário, não do banco.
- Normal quando
- Aparece entre todas as chamadas. Esperas longas e isoladas são o usuário pensando ou a aplicação ocupada com outra coisa.
- Preocupa quando
- Domina o tempo total com muitas esperas curtas: a aplicação conversa demais com o banco (uma linha por chamada, SQL dentro de laço). Com poucas esperas longas, a demora está na aplicação, e ajuste de SQL não resolve.
- Onde olhar
- Quantas idas e voltas houve e quanto dura cada uma: Perfil, linha deste componente: colunas Ocorrências e Média (s)
- Muitas esperas curtas ou poucas longas: Distribuição de latência, tabela deste evento
- FETCH que trazem poucas linhas cada: Tipos de chamada, linha FETCH: Quantidade e Linhas
- Comandos que mais esperaram a aplicação: Principais comandos por componente, grupo deste evento
Mensagem entre processos
reliable message
A sessão mandou uma mensagem a processos de fundo ou a outras instâncias e espera a confirmação.
- Normal quando
- Soma pouco tempo.
- Preocupa quando
- Soma muito: TRUNCATE, result cache ou mudança de parâmetro em RAC.
- Onde olhar
- Comandos que mais esperaram: Principais comandos por componente, grupo deste evento
Abrindo ou fechando arquivos
Disk file operations I/O
Operações no arquivo (abrir, fechar, consultar tamanho), não leitura de dados.
- Normal quando
- Soma pouco tempo.
- Preocupa quando
- Soma muito: muitos arquivos abertos e fechados, ou sistema de arquivos lento.
- Onde olhar
- Quantas ocorrências e quanto dura cada uma: Perfil, linha deste componente: colunas Ocorrências e Média (s)
Mandando a resposta
SQL*Net message to client
Tempo para entregar um pacote de resposta ao sistema operacional. Não mede a rede até o cliente, só a entrega ao SO.
- Normal quando
- Microssegundos por ocorrência, uma por chamada.
- Preocupa quando
- A média sobe para milissegundos: buffer de rede do servidor cheio ou rede saturada.
- Onde olhar
- Média e máximo por espera: Perfil, linha deste componente: colunas Média (s) e Máx (s)
Não contabilizado
Não contabilizado
Tempo que o trace não explica por CPU nem por espera: dentro das chamadas e entre elas.
- Normal quando
- Pequeno.
- Preocupa quando
- Fila de CPU, paginação, lacunas no trace ou arquivo faltando na coleta.
- Onde olhar
- Os dois componentes de tempo não contabilizado e o cartão de cada um: Perfil do tempo de resposta
CPU
CPU
Tempo de CPU das chamadas ao banco (o c= de PARSE, EXEC e FETCH).
- Normal quando
- É o trabalho do banco.
- Preocupa quando
- Soma muito: leituras lógicas demais (plano), parse em excesso ou PL/SQL pesado.
- Onde olhar
- CPU por tipo de chamada: Tipos de chamada
- Comandos com mais leituras lógicas: Comandos SQL, colunas LIO e Linhas
- Comandos que mais gastaram CPU: Principais comandos por classe, grupo desta classe
Application (aplicação)
Application
Esperas causadas pela forma como a aplicação usa o banco: linhas e tabelas bloqueadas por outra sessão, locks da aplicação, erros devolvidos.
- Normal quando
- Soma pouco tempo.
- Preocupa quando
- Sessão parada esperando outra: transações longas, mesma linha atualizada por várias sessões, chave estrangeira sem índice.
- Onde olhar
- Quais eventos pesam: Por classe de espera, linha desta classe: coluna Principais componentes
- Objetos disputados: Objetos com mais tempo de espera
- Comandos que ficaram bloqueados: Principais comandos por classe, grupo desta classe
- Quem segura o lock: v$session.blocking_session, no banco
Idle (ociosa)
Idle
A sessão espera trabalho. Num trace de sessão, quase sempre é SQL*Net message from client: tempo da aplicação, da rede e do usuário.
- Normal quando
- Aparece entre as chamadas.
- Preocupa quando
- Domina o tempo total e o usuário reclama da demora: a lentidão está fora do banco (aplicação, rede, idas e voltas demais).
- Onde olhar
- Quantas idas e voltas houve: Resumo, Chamadas ao banco e Esperas
- FETCH que trazem poucas linhas cada: Tipos de chamada, linha FETCH: Quantidade e Linhas
- Comandos que mais esperaram a aplicação: Principais comandos por classe, grupo desta classe
Other (outros)
Other
Eventos internos sem classe mais específica.
- Normal quando
- Soma pouco tempo.
- Preocupa quando
- Soma muito: o evento é que diz a causa.
- Onde olhar
- Qual evento pesa: Por classe de espera, linha desta classe: coluna Principais componentes
Network (rede)
Network
Mandar e receber dados pelo SQL*Net, com a aplicação ou com outro banco por dblink.
- Normal quando
- Soma pouco tempo.
- Preocupa quando
- Resultados grandes, arraysize baixo ou dblink lento.
- Onde olhar
- Quais eventos da classe pesam (more data, dblink): Por classe de espera, linha desta classe: coluna Principais componentes
- Linhas por FETCH: Tipos de chamada, linha FETCH: Quantidade e Linhas
- Comandos que mais usaram a rede: Principais comandos por classe, grupo desta classe
SQL recursivo (comandos filhos)
SQL recursivo (comandos filhos)
Tempo das chamadas que este comando disparou: SQL dentro de funções e procedures PL/SQL, triggers e consultas ao dicionário.
- Normal quando
- Comando PL/SQL que executa outros SQL.
- Preocupa quando
- Soma muito num SELECT ou DML simples: função PL/SQL chamada por linha, ou trigger pesado.
- Onde olhar
- Quais comandos filhos e quanto custa cada um: detalhe do comando, SQL recursivo
#1 · SELECT
49 variantesTexto
SELECT (SELECT COL_0073 FROM TAB_00051 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0073 FROM DUAL
- 1 TAB_0005: operação 2 do plano
Texto da forma: os literais viraram :s (texto) e :n (número).
Variantes que mais gastaram
| Chamadas | Inclusivo (s) | Literais |
|---|---|---|
| 7.276 | 0,144 | ***, *** |
| 7.272 | 0,120 | ***, *** |
| 7.276 | 0,110 | ***, *** |
| 7.272 | 0,107 | ***, *** |
| 7.276 | 0,107 | ***, *** |
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 2,239668 | 45,3 | 89.112 | |
| cpu | 1,558749 | 31,5 | 89.112 | |
| cpu | 0,903868 | 18,3 | 89.112 | |
| cpu | 0,123982 | 2,5 | 89.112 | |
| não contabilizado | 0,114630 | 2,3 | 356.448 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 89.112 | 1,558749 | 1,567573 | 0 | 0 | 0 | 0 | 49 |
| EXEC | 89.112 | 0,903868 | 0,922604 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 89.112 | 2,239668 | 2,327062 | 0 | 445.560 | 0 | 89.112 | 0 |
| CLOSE | 89.112 | 0,123982 | 0,123658 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3212480556
Das linhas STAT do trace; plano gravado 89115 vezes, mostrando o da gravação mais demorada.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · TABLE ACCESS FULL TAB_0005 86,5% do tempo · 100,0% das leituras lógicas
Lê o objeto inteiro: confira se o filtro é seletivo e se há índice para ele.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0,000004 | 10,8 | 0 | 0,0 | 0 | 0 | 0,000036 | 5 | ||||||
| 2 | 1 | 1 | 1 | 0,000032 | 86,5 | 5 | 100,0 | 0 | 0 | 0,000032 | 5 | 3 | 1008999 | ||
| 3 | FAST DUAL | 1 | 1 | 0,000001 | 2,7 | 0 | 0,0 | 0 | 0 | 0,000001 | 0 | 2 |
Corte em N linhas
COUNT STOPKEY
Para de ler depois de N linhas (ROWNUM <= N ou FETCH FIRST).
- Boa quando
- Corta o trabalho cedo quando as linhas já chegam na ordem certa.
- Ruim quando
- Quando há uma ordenação completa embaixo: tudo é lido antes do corte.
- No plano, olhe
- Linhas das operações de baixo.
Leitura completa da tabela (full table scan)
TABLE ACCESS FULL
Lê todos os blocos do segmento até a high water mark (HWM), com multiblock reads (db file scattered read, ou direct path read na leitura direta).
- Boa quando
- A consulta precisa de boa parte das linhas, a tabela é pequena, ou a leitura é em lote. No Exadata (STORAGE FULL) o filtro roda nas células de armazenamento (smart scan).
- Ruim quando
- O predicado é seletivo e sobram poucas linhas: o custo cresce com o tamanho do segmento, não com o resultado. Pior como inner de um NESTED LOOPS: o full scan se repete para cada linha do outer.
- No plano, olhe
- LIO próprio alto com poucas Linhas devolvidas: predicado seletivo sem índice útil. Exec maior que 1: full scan repetido.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#2 · SELECT
49 variantesTexto
SELECT (SELECT COL_0075 FROM TAB_00051 WHERE COL_0074 = :n AND ROWNUM <=:n) AS COL_0075 FROM DUAL
- 1 TAB_0005: operação 2 do plano
Texto da forma: os literais viraram :s (texto) e :n (número).
Variantes que mais gastaram
| Chamadas | Inclusivo (s) | Literais |
|---|---|---|
| 7.272 | 0,109 | ***, *** |
| 7.276 | 0,106 | ***, *** |
| 7.276 | 0,103 | ***, *** |
| 7.272 | 0,103 | ***, *** |
| 7.276 | 0,102 | ***, *** |
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 2,287639 | 47,2 | 89.112 | |
| cpu | 1,626753 | 33,6 | 89.112 | |
| cpu | 0,864872 | 17,9 | 89.112 | |
| cpu | 0,130972 | 2,7 | 89.112 | |
| não contabilizado | -0,067789 | -1,4 | 356.448 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 89.112 | 1,626753 | 1,573453 | 0 | 0 | 0 | 0 | 49 |
| EXEC | 89.112 | 0,864872 | 0,878362 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 89.112 | 2,287639 | 2,267754 | 0 | 445.560 | 0 | 89.112 | 0 |
| CLOSE | 89.112 | 0,130972 | 0,122878 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3212480556
Das linhas STAT do trace; plano gravado 89114 vezes, mostrando o da gravação mais demorada.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · TABLE ACCESS FULL TAB_0005 90,4% do tempo · 100,0% das leituras lógicas
Lê o objeto inteiro: confira se o filtro é seletivo e se há índice para ele.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0,000003 | 5,8 | 0 | 0,0 | 0 | 0 | 0,000050 | 5 | ||||||
| 2 | 1 | 1 | 1 | 0,000047 | 90,4 | 5 | 100,0 | 0 | 0 | 0,000047 | 5 | 3 | 1008999 | ||
| 3 | FAST DUAL | 1 | 1 | 0,000002 | 3,8 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | 2 |
Corte em N linhas
COUNT STOPKEY
Para de ler depois de N linhas (ROWNUM <= N ou FETCH FIRST).
- Boa quando
- Corta o trabalho cedo quando as linhas já chegam na ordem certa.
- Ruim quando
- Quando há uma ordenação completa embaixo: tudo é lido antes do corte.
- No plano, olhe
- Linhas das operações de baixo.
Leitura completa da tabela (full table scan)
TABLE ACCESS FULL
Lê todos os blocos do segmento até a high water mark (HWM), com multiblock reads (db file scattered read, ou direct path read na leitura direta).
- Boa quando
- A consulta precisa de boa parte das linhas, a tabela é pequena, ou a leitura é em lote. No Exadata (STORAGE FULL) o filtro roda nas células de armazenamento (smart scan).
- Ruim quando
- O predicado é seletivo e sobram poucas linhas: o custo cresce com o tamanho do segmento, não com o resultado. Pior como inner de um NESTED LOOPS: o full scan se repete para cada linha do outer.
- No plano, olhe
- LIO próprio alto com poucas Linhas devolvidas: predicado seletivo sem índice útil. Exec maior que 1: full scan repetido.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#3 · INSERT
1.217 variantesTexto
INSERT INTO TAB_0001 (COL_0076,COL_0077,COL_0078,COL_0079,COL_0080,COL_0081,COL_0082,COL_0083,COL_0084,COL_0085,COL_0086,COL_0087,COL_0088,COL_0089,COL_0090,COL_0091,COL_0092,COL_0093,COL_0094,COL_0095,COL_0096,COL_0097,COL_0098,COL_0099,COL_0100,COL_0101,COL_0102,COL_0103,COL_0104,COL_0105,COL_0106,COL_0107,COL_0108,COL_0109,COL_0110,COL_0111,COL_0112,COL_0113,COL_0114,COL_0115,COL_0116,COL_0117,COL_0118,COL_0119,COL_0003,COL_0120,COL_0121,COL_0122,COL_0123) VALUES (:s,:s,:s,:s,:s,:s,:s,:s,NULL,:s,:s,NULL,:s,NULL,NULL,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,:s,:n ,NULL,:s,:s,:n ,:s,:s,:s)
- 1 operação 1 (LOAD TABLE CONVENTIONAL) não tem objeto próprio no texto
Texto da forma: os literais viraram :s (texto) e :n (número).
Variantes que mais gastaram
| Chamadas | Inclusivo (s) | Literais |
|---|---|---|
| 3 | 0,006 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***',… |
| 3 | 0,006 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***',… |
| 3 | 0,005 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***',… |
| 3 | 0,004 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***',… |
| 3 | 0,004 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***',… |
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 1,314810 | 90,6 | 1.217 | |
| cpu | 0,152976 | 10,5 | 1.217 | |
| espera | 0,002378 | 0,2 | 32 | |
| cpu | 0,000000 | 0,0 | 1.217 | |
| não contabilizado | -0,018753 | -1,3 | 3.651 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1.217 | 1,314810 | 1,295202 | 0 | 0 | 0 | 0 | 1.217 |
| EXEC | 1.217 | 0,152976 | 0,154230 | 32 | 1.249 | 7.512 | 1.217 | 0 |
| CLOSE | 1.217 | 0,000000 | 0,001979 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3212480556
Das linhas STAT do trace; plano gravado 1217 vezes, mostrando o da gravação mais demorada.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0,003105 | 100,0 | 1 | 100,0 | 0 | 0 | 0,003105 | 1 |
Inserção convencional
LOAD TABLE CONVENTIONAL
Insere as linhas na tabela pelo caminho normal do INSERT.
- Boa quando
- Inserções do dia a dia.
- Ruim quando
- Triggers, índices e constraints da tabela pesam aqui; em carga grande, o modo direto (APPEND) grava mais rápido.
- No plano, olhe
- Tempo próprio (s) e as esperas do comando.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#4 · PL/SQL
sql_id 9sxjs1fk1qc9ghv 2753245487Texto
BEGIN ROT_0001('***',*** ); END;
Texto cortado: o trace declara 42 caracteres.
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,066395 | 48,6 | 5.333 | |
| recursivo | 0,063234 | 46,3 | ||
| cpu | 0,004999 | 3,7 | 1 | |
| não contabilizado | 0,001996 | 1,5 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,010998 | 0,070229 | 8 | 24 | 0 | 0 | 1 |
SQL recursivo executado por este comando
#5 · ALTER SESSION
sql_id 68ngguy15jsj7hv 2186863143Texto
alter session set events='***'
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,037654 | 93,8 | 3 | |
| cpu | 0,002000 | 5,0 | 1 | |
| espera | 0,000489 | 1,2 | 1 | |
| espera | 0,000003 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000157 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,002000 | 0,039483 | 0 | 0 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000014 | 0 | 0 | 0 | 0 | 0 |
#6 · ?
Texto
Texto não disponível: o cursor foi aberto antes do início do trace.
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,024934 | 93,5 | 2 | |
| cpu | 0,001000 | 3,8 | 1 | |
| espera | 0,000723 | 2,7 | 1 | |
| espera | 0,000004 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| EXEC | 1 | 0,001000 | 0,025924 | 0 | 0 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000010 | 0 | 0 | 0 | 0 | 0 |
#7 · DELETE
sql_id 42q0kx6suxhw2hv 2981020546Texto
DELETE FROM TAB_0001
- 1 IDX_0001 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,930878 | 91,0 | 1.870 | |
| cpu | 0,130980 | 12,8 | 2 | |
| espera | 0,000354 | 0,0 | 7 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| não contabilizado | -0,039494 | -3,9 | 6 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000138 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,130980 | 1,022574 | 1.870 | 3.740 | 0 | 0 | 0 |
| CLOSE | 2 | 0,000000 | 0,000006 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2124198792
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX FULL SCAN IDX_0001 99,1% do tempo · 100,0% das leituras lógicas
Lê o objeto inteiro: confira se o filtro é seletivo e se há índice para ele.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 0,000050 | 0,9 | 0 | 0,0 | 0 | 0 | 0,005432 | 1.870 | ||||||
| 2 | 1 | 0 | 1 | 0,005382 | 99,1 | 1.870 | 100,0 | 0 | 0 | 0,005382 | 1.870 | 2 | 188047 |
Exclusão
DELETE
Apaga as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais; chave estrangeira sem índice na tabela filha trava a tabela inteira.
- No plano, olhe
- Linhas do row source abaixo.
Leitura completa do índice, em ordem
INDEX FULL SCAN
Lê o índice inteiro em ordem de chave, percorrendo os leaf blocks um a um, com single block reads (db file sequential read).
- Boa quando
- Evita uma ordenação: o ORDER BY ou o GROUP BY é pela chave do índice.
- Ruim quando
- Índice grande lido inteiro, bloco a bloco, quando uma leitura em lote (INDEX FAST FULL SCAN) ou um acesso seletivo seria possível.
- No plano, olhe
- LIO próprio e Tempo próprio (s).
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#8 · INSERT
350 variantesTexto
INSERT INTO TAB_0001 (COL_0076,COL_0077,COL_0078,COL_0079,COL_0080,COL_0081,COL_0082,COL_0083,COL_0084,COL_0085,COL_0086,COL_0087,COL_0088,COL_0089,COL_0090,COL_0091,COL_0092,COL_0093,COL_0094,COL_0095,COL_0096,COL_0097,COL_0098,COL_0099,COL_0100,COL_0101,COL_0102,COL_0103,COL_0104,COL_0105,COL_0106,COL_0107,COL_0108,COL_0109,COL_0110,COL_0111,COL_0112,COL_0113,COL_0114,COL_0115,COL_0116,COL_0117,COL_0118,COL_0119,COL_0003,COL_0120,COL_0121,COL_0122,COL_0123) VALUES (:s,:s,:s,:s,:s,:s,:s,:s,NULL,:s,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,:s,:n ,NULL,:s,:s,:n ,:s,:s,:s)
- 1 operação 1 (LOAD TABLE CONVENTIONAL) não tem objeto próprio no texto
Texto da forma: os literais viraram :s (texto) e :n (número).
Variantes que mais gastaram
| Chamadas | Inclusivo (s) | Literais |
|---|---|---|
| 3 | 0,024 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', ***,… |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', ***, … |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', ***,… |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', ***, … |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', ***,… |
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,352953 | 84,7 | 350 | |
| cpu | 0,040994 | 9,8 | 350 | |
| recursivo | 0,018535 | 4,4 | ||
| espera | 0,002529 | 0,6 | 12 | |
| cpu | 0,001000 | 0,2 | 350 | |
| não contabilizado | 0,000606 | 0,1 | 1.050 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 350 | 0,355953 | 0,372854 | 6 | 78 | 0 | 0 | 350 |
| EXEC | 350 | 0,040994 | 0,043200 | 12 | 358 | 2.154 | 350 | 0 |
| CLOSE | 350 | 0,001000 | 0,000563 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3212480556
Das linhas STAT do trace; plano gravado 350 vezes, mostrando o da gravação mais demorada.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0,000904 | 100,0 | 1 | 100,0 | 4 | 0 | 0,000904 | 1 |
Inserção convencional
LOAD TABLE CONVENTIONAL
Insere as linhas na tabela pelo caminho normal do INSERT.
- Boa quando
- Inserções do dia a dia.
- Ruim quando
- Triggers, índices e constraints da tabela pesam aqui; em carga grande, o modo direto (APPEND) grava mais rápido.
- No plano, olhe
- Tempo próprio (s) e as esperas do comando.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
SQL recursivo executado por este comando
#9 · INSERT
251 variantesTexto
INSERT INTO TAB_0001 (COL_0076,COL_0077,COL_0078,COL_0079,COL_0080,COL_0081,COL_0082,COL_0083,COL_0084,COL_0085,COL_0086,COL_0087,COL_0088,COL_0089,COL_0090,COL_0091,COL_0092,COL_0093,COL_0094,COL_0095,COL_0096,COL_0097,COL_0098,COL_0099,COL_0100,COL_0101,COL_0102,COL_0103,COL_0104,COL_0105,COL_0106,COL_0107,COL_0108,COL_0109,COL_0110,COL_0111,COL_0112,COL_0113,COL_0114,COL_0115,COL_0116,COL_0117,COL_0118,COL_0119,COL_0003,COL_0120,COL_0121,COL_0122,COL_0123) VALUES (:s,:s,:s,:s,:s,:s,:s,:s,NULL,:s,:s,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,NULL,NULL,NULL,NULL,NULL,NULL,NULL,:s,:s,:n ,NULL,:s,:s,:n ,:s,:s,:s)
- 1 operação 1 (LOAD TABLE CONVENTIONAL) não tem objeto próprio no texto
Texto da forma: os literais viraram :s (texto) e :n (número).
Variantes que mais gastaram
| Chamadas | Inclusivo (s) | Literais |
|---|---|---|
| 3 | 0,003 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***'… |
| 3 | 0,003 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***'… |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***'… |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***'… |
| 3 | 0,002 | '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***', '***'… |
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,253971 | 88,3 | 251 | |
| cpu | 0,034992 | 12,2 | 251 | |
| espera | 0,000954 | 0,3 | 5 | |
| cpu | 0,000000 | 0,0 | 251 | |
| não contabilizado | -0,002291 | -0,8 | 753 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 251 | 0,253971 | 0,256408 | 0 | 0 | 0 | 0 | 251 |
| EXEC | 251 | 0,034992 | 0,030809 | 5 | 256 | 1.544 | 251 | 0 |
| CLOSE | 251 | 0,000000 | 0,000409 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3212480556
Das linhas STAT do trace; plano gravado 251 vezes, mostrando o da gravação mais demorada.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0,000646 | 100,0 | 2 | 100,0 | 1 | 0 | 0,000646 | 2 |
Inserção convencional
LOAD TABLE CONVENTIONAL
Insere as linhas na tabela pelo caminho normal do INSERT.
- Boa quando
- Inserções do dia a dia.
- Ruim quando
- Triggers, índices e constraints da tabela pesam aqui; em carga grande, o modo direto (APPEND) grava mais rápido.
- No plano, olhe
- Tempo próprio (s) e as esperas do comando.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#10 · TRUNCATE TABLE
sql_id 9y5d9x2wwc9nnhv 3116770964Texto
TRUNCATE TABLE TAB_0005
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| recursivo | 0,040612 | 49,5 | ||
| espera | 0,014392 | 17,6 | 1 | |
| cpu | 0,008999 | 11,0 | 1 | |
| cpu | 0,008998 | 11,0 | 1 | |
| espera | 0,008094 | 9,9 | 3 | |
| espera | 0,000616 | 0,8 | 3 | |
| espera | 0,000162 | 0,2 | 7 | |
| espera | 0,000082 | 0,1 | 1 | |
| não contabilizado | 0,000023 | 0,0 | 3 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,013998 | 0,013202 | 3 | 18 | 1 | 0 | 1 |
| EXEC | 1 | 0,024996 | 0,068773 | 14 | 44 | 47 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000003 | 0 | 0 | 0 | 0 | 0 |
SQL recursivo executado por este comando
#11 · SELECT
sql_id 2vb5a3dnk45pjhv 1763841713Texto
SELECT COL_0066 FROM ALL_TAB_COLUMNS WHERE OWNER = '***' AND COL_0063 = :B2 AND COL_0067 = :B1
- 1 IDX_0012 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 28)
- 2 OBJ$ (tabela do índice I_OBJ5) não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 22)
- 3 COLTYPE$ não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 25)
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,015414 | 50,8 | 4 | |
| cpu | 0,010998 | 36,2 | 50 | |
| cpu | 0,009998 | 32,9 | 50 | |
| cpu | 0,000000 | 0,0 | 50 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,006045 | -19,9 | 151 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000019 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 50 | 0,010998 | 0,007154 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 50 | 0,009998 | 0,023110 | 4 | 1.000 | 0 | 50 | 0 |
| CLOSE | 50 | 0,000000 | 0,000082 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2802916940
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 28 · INDEX RANGE SCAN IDX_0012 63,4% do tempo · 10,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 22 · INDEX RANGE SCAN I_OBJ5 34,3% do tempo · 15,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 3 Id 25 · TABLE ACCESS CLUSTER COLTYPE$ 0,1% do tempo · 15,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 18 | |||
| 2 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 36 | |||
| 3 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 18 | |||
| 4 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 36 | |||
| 5 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 18 | |||
| 6 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 36 | |||
| 7 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 18 | |||
| 8 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 36 | |||
| 9 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 18 | |||
| 10 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 36 | |||
| 11 | 1 | 0,000061 | 0,4 | 0 | 0,0 | 4 | 0 | 0,015885 | 20 | ||||||
| 12 | 1 | 1 | 0,000006 | 0,0 | 0 | 0,0 | 4 | 0 | 0,015802 | 16 | 11 | ||||
| 13 | 1 | 1 | 0,000003 | 0,0 | 0 | 0,0 | 4 | 0 | 0,015783 | 15 | 10 | ||||
| 14 | 1 | 1 | 0,000005 | 0,0 | 0 | 0,0 | 4 | 0 | 0,015776 | 15 | 9 | ||||
| 15 | 1 | 1 | 0,000003 | 0,0 | 0 | 0,0 | 3 | 0 | 0,005692 | 13 | 8 | ||||
| 16 | 1 | 1 | 0,000004 | 0,0 | 0 | 0,0 | 3 | 0 | 0,005685 | 13 | 6 | ||||
| 17 | 1 | 1 | 0,000005 | 0,0 | 0 | 0,0 | 3 | 0 | 0,005668 | 10 | 5 | ||||
| 18 | 1 | 1 | 0,000002 | 0,0 | 0 | 0,0 | 2 | 0 | 0,005589 | 6 | 4 | ||||
| 19 | 1 | 1 | 0,000005 | 0,0 | 1 | 5,0 | 0 | 0 | 0,000012 | 2 | 1 | 22 | |||
| 20 | 1 | 1 | 0,000007 | 0,0 | 1 | 5,0 | 0 | 0 | 0,000007 | 1 | 0 | 46 | |||
| 21 | 1 | 1 | 0,000119 | 0,7 | 1 | 5,0 | 2 | 0 | 0,005575 | 4 | 3 | 18 | |||
| 22 | 2 | 1 | 1 | 0,005456 | 34,3 | 3 | 15,0 | 1 | 0 | 0,005456 | 3 | 2 | 40 | ||
| 23 | 1 | 1 | 0,000065 | 0,4 | 2 | 10,0 | 1 | 0 | 0,000074 | 4 | 1 | 21 | |||
| 24 | 1 | 1 | 0,000009 | 0,1 | 2 | 10,0 | 0 | 0 | 0,000009 | 2 | 0 | 3 | |||
| 25 | 3 | 0 | 1 | 0,000013 | 0,1 | 3 | 15,0 | 0 | 0 | 0,000013 | 3 | 1 | 83 | ||
| 26 | 0 | 1 | 0,000001 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000004 | 0 | 2 | 18 | |||
| 27 | 0 | 1 | 0,000003 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000003 | 0 | 1 | 38 | |||
| 28 | 1 | 1 | 1 | 0,010079 | 63,4 | 2 | 10,0 | 1 | 0 | 0,010079 | 2 | 1 | 427 | ||
| 29 | 0 | 1 | 0,000004 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000004 | 0 | 1 | 47 | |||
| 30 | 1 | 1 | 0,000013 | 0,1 | 1 | 5,0 | 0 | 0 | 0,000013 | 1 | 1 | 47 | |||
| 31 | 0 | 1 | 0,000014 | 0,1 | 2 | 10,0 | 0 | 0 | 0,000022 | 4 | 2 | 4 | |||
| 32 | 1 | 1 | 0,000008 | 0,1 | 2 | 10,0 | 0 | 0 | 0,000008 | 2 | 1 | 3 | |||
| 33 | 0 | 2 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 34 | 0 | 10 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 62 | |||
| 35 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | ||||
| 36 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | ||||
| 37 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 38 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 47 | |||
| 39 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 39 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Filtro
FILTER
Aplica um predicado às linhas do row source abaixo. Com dois row sources, executa o segundo (subquery não desaninhada) para cada linha do primeiro.
- Boa quando
- Um row source só, ou subquery executada poucas vezes (o FILTER guarda em cache os resultados já calculados).
- Ruim quando
- Subquery executada linha a linha (Exec alto no segundo row source): permitir o unnesting ou reescrever como junção costuma resolver.
- No plano, olhe
- Exec do segundo row source.
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Tabela interna do Oracle (X$)
FIXED TABLE
Lê uma estrutura de memória do Oracle, por trás das views V$.
- Boa quando
- Consultas pontuais.
- Ruim quando
- Consultas frequentes a V$ grandes (V$SQL, V$SESSION) por rotinas de monitoração.
Skip scan do índice
INDEX SKIP SCAN
Usa um índice composto sem a primeira coluna no filtro: percorre o índice uma vez para cada valor distinto da primeira coluna.
- Boa quando
- A primeira coluna do índice tem poucos valores distintos.
- Ruim quando
- A primeira coluna tem muitos valores: vira quase uma leitura do índice inteiro. Um índice que comece pela coluna filtrada costuma resolver.
- No plano, olhe
- LIO próprio comparado com as Linhas devolvidas.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#12 · SELECT
sql_id 5tp7ar1mxbgphhv 1742061232Texto
select /*+ index(idl_char$12 i_idl_char1) +*/ piece#,length,piece from idl_char$12 where obj#=:1 and part=:2 and version=:3 order by piece#
- 1 IDL_CHAR$: operação 1 do plano
- 2 IDL_CHAR$, tabela do índice I_IDL_CHAR1: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,023874 | 97,1 | 2 | |
| cpu | 0,001000 | 4,1 | 2 | |
| cpu | 0,000999 | 4,1 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,001279 | -5,2 | 5 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000061 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000999 | 0,000318 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,001000 | 0,024202 | 2 | 4 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000013 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1319326155
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 1 · TABLE ACCESS BY INDEX ROWID IDL_CHAR$ 71,1% do tempo · 33,3% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 2 Id 2 · INDEX RANGE SCAN I_IDL_CHAR1 28,9% do tempo · 66,7% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0,017191 | 71,1 | 1 | 33,3 | 2 | 0 | 0,024172 | 3 | 3 | 226 | ||
| 2 | 2 | 1 | 1 | 0,006981 | 28,9 | 2 | 66,7 | 1 | 0 | 0,006981 | 2 | 2 | 237 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#13 · SELECT
sql_id 6q9x9bmh733r2hv 3765538530Texto
select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,i.flags,i.property,i.pctfree$,i.initrans,i.maxtrans,i.blevel,i.leafcnt,i.distkey,i.lblkkey,i.dblkkey,i.clufac,i.cols,i.analyzetime,i.samplesize,i.dataobj#,nvl(i.degree,***),nvl(i.instances,***),i.rowcnt,mod(i.pctthres$,***),i.COL_0011,i.trunccnt,nvl(c.unicols,***),nvl(c.COL_0012+c.COL_0013,***),nvl(i.spare1,i.intcols),i.spare4,i.spare2,i.spare6,decode(i.pctthres$,null,null,mod(trunc(i.pctthres$/***),***)),ist.cachedblk,ist.cachehit,ist.logicalread from ind$23 i, ind_stats$ ist, (select enabled, min(cols) unicols,min(to_number(bitand(defer,***))) COL_0012,min(to_number(bitand(defer,***))) COL_0013 from cdef$1 where obj#=:1 and enabled > *** group by enabled) c where i.obj#=c.enabled(+) and i.obj# = ist.obj#(+) and i.bo#=:1 order by i.obj#
- 1 CDEF$: operação 10 do plano
- 2 IND$: operação 4 do plano
- 3 IND$, tabela do índice I_OBJ#: operação 5 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,015645 | 87,9 | 7 | |
| cpu | 0,002000 | 11,2 | 3 | |
| cpu | 0,001000 | 5,6 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| não contabilizado | -0,000843 | -4,7 | 9 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000122 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,001000 | 0,000487 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 3 | 0,002000 | 0,017187 | 7 | 12 | 0 | 1 | 0 |
| CLOSE | 2 | 0,000000 | 0,000006 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3992920156
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 10 · TABLE ACCESS BY INDEX ROWID CDEF$ 48,3% do tempo · 22,2% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 2 Id 4 · TABLE ACCESS CLUSTER IND$ 47,3% do tempo · 22,2% das leituras lógicas
- 3 Id 5 · INDEX UNIQUE SCAN I_OBJ# 0,1% do tempo · 22,2% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 0,000033 | 0,2 | 0 | 0,0 | 5 | 0 | 0,016567 | 9 | 7 | ||||
| 2 | 1 | 2 | 0,000571 | 3,4 | 0 | 0,0 | 5 | 0 | 0,016534 | 9 | 6 | ||||
| 3 | 1 | 2 | 0,000007 | 0,0 | 0 | 0,0 | 2 | 0 | 0,007862 | 5 | 2 | ||||
| 4 | 2 | 1 | 2 | 0,007832 | 47,3 | 2 | 22,2 | 2 | 0 | 0,007846 | 4 | 2 | 19 | ||
| 5 | 3 | 1 | 1 | 0,000014 | 0,1 | 2 | 22,2 | 0 | 0 | 0,000014 | 2 | 1 | 3 | ||
| 6 | 0 | 1 | 0,000002 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000009 | 1 | 0 | 432 | |||
| 7 | 0 | 1 | 0,000007 | 0,0 | 1 | 11,1 | 0 | 0 | 0,000007 | 1 | 0 | 433 | |||
| 8 | 1 | 1 | 0,000004 | 0,0 | 0 | 0,0 | 3 | 0 | 0,008101 | 4 | 3 | ||||
| 9 | 1 | 1 | 0,000044 | 0,3 | 0 | 0,0 | 3 | 0 | 0,008097 | 4 | 3 | ||||
| 10 | 1 | 1 | 1 | 0,008001 | 48,3 | 2 | 22,2 | 3 | 0 | 0,008053 | 4 | 2 | 31 | ||
| 11 | 5 | 4 | 0,000052 | 0,3 | 2 | 22,2 | 1 | 0 | 0,000052 | 2 | 1 | 54 |
Ordenação (ORDER BY)
SORT ORDER BY
Ordena as linhas para o ORDER BY.
- Boa quando
- Poucas linhas, ordenação em memória.
- Ruim quando
- Muitas linhas: a ordenação não cabe na workarea e grava no TEMP. Um índice na ordem pedida pode evitar o SORT, principalmente com ROWNUM ou FETCH FIRST.
- No plano, olhe
- PW maior que zero e Tempo próprio (s).
Junção por hash
HASH JOIN
Monta uma hash table na PGA com o primeiro row source (build input, o menor) e lê o segundo (probe input) procurando as correspondências.
- Boa quando
- Juntar muitas linhas sem índice útil: cada lado é lido uma vez só.
- Ruim quando
- O build input é grande e não cabe na workarea da PGA: a junção vira one-pass ou multipass e grava no TEMP. Ou poucas linhas bastariam e um NESTED LOOPS com índice seria mais barato.
- No plano, olhe
- PW maior que zero (gravação no TEMP), Tempo próprio (s) e as Linhas do build input.
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
View ou subconsulta
VIEW
Resultado de uma view ou subconsulta usado como fonte de linhas pela operação de cima.
- Boa quando
- Não custa em si: o trabalho está nas operações de baixo.
- Ruim quando
- Quando impede que o filtro de fora entre na view e ela é lida inteira.
- No plano, olhe
- As operações de baixo.
Agrupamento por ordenação
SORT GROUP BY
Agrupa as linhas para o GROUP BY ordenando pela chave do grupo.
- Boa quando
- Poucas linhas, ou o resultado precisa sair ordenado.
- Ruim quando
- Muitas linhas, com gravação no TEMP.
- No plano, olhe
- PW e Tempo próprio (s).
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#14 · SELECT
sql_id 7d78xc7z6vr4fhv 4268612750Texto
select o.owner#, o.name, o.namespace, o.obj#, d.COL_0051, nvl(d.property,***), o.type#, o.subname, d.d_attrs from dependency$1 d, obj$ o where d.COL_0052=:1 and (d.p_timestamp=nvl(:2,d.p_timestamp) or d.property=***) and o.owner#=nvl(:3,o.owner#) and d.COL_0053=o.obj# order by o.obj#
- 1 DEPENDENCY$, tabela do índice I_DEPENDENCY2: operação 7 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,016134 | 96,4 | 1 | |
| não contabilizado | 0,000609 | 3,6 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000054 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000403 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,016270 | 1 | 6 | 0 | 0 | 0 |
| CLOSE | 2 | 0,000000 | 0,000016 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3014793611
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 7 · INDEX RANGE SCAN I_DEPENDENCY2 99,7% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 2 | 0,000017 | 0,1 | 0 | 0,0 | 1 | 0 | 0,016258 | 3 | 17 | ||||
| 2 | 0 | 0,000009 | 0,1 | 0 | 0,0 | 1 | 0 | 0,016241 | 3 | ||||||
| 3 | 0 | 0,000006 | 0,0 | 0 | 0,0 | 1 | 0 | 0,016230 | 3 | ||||||
| 4 | 0 | 0,000002 | 0,0 | 0 | 0,0 | 1 | 0 | 0,016224 | 3 | ||||||
| 5 | 0 | 1 | 0,000002 | 0,0 | 0 | 0,0 | 1 | 0 | 0,016222 | 3 | 8 | ||||
| 6 | 0 | 1 | 0,000003 | 0,0 | 0 | 0,0 | 1 | 0 | 0,016220 | 3 | 6 | 104 | |||
| 7 | 1 | 0 | 5 | 0,016217 | 99,7 | 3 | 100,0 | 1 | 0 | 0,016217 | 3 | 3 | 107 | ||
| 8 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 36 | |||
| 9 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 18 | |||
| 10 | 0 | 0,000002 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | ||||||
| 11 | 0 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | ||||||
| 12 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 8 | ||||
| 13 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 6 | 104 | |||
| 14 | 0 | 5 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 107 | |||
| 15 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 36 | |||
| 16 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 18 |
Ordenação (ORDER BY)
SORT ORDER BY
Ordena as linhas para o ORDER BY.
- Boa quando
- Poucas linhas, ordenação em memória.
- Ruim quando
- Muitas linhas: a ordenação não cabe na workarea e grava no TEMP. Um índice na ordem pedida pode evitar o SORT, principalmente com ROWNUM ou FETCH FIRST.
- No plano, olhe
- PW maior que zero e Tempo próprio (s).
Expansão de OR
CONCATENATION
Cada parte de uma condição OR virou um ramo, e os resultados são juntados.
- Boa quando
- Cada ramo usa um índice diferente e seletivo.
- Ruim quando
- Muitos ramos repetindo o mesmo trabalho.
- No plano, olhe
- Cada ramo abaixo.
Filtro
FILTER
Aplica um predicado às linhas do row source abaixo. Com dois row sources, executa o segundo (subquery não desaninhada) para cada linha do primeiro.
- Boa quando
- Um row source só, ou subquery executada poucas vezes (o FILTER guarda em cache os resultados já calculados).
- Ruim quando
- Subquery executada linha a linha (Exec alto no segundo row source): permitir o unnesting ou reescrever como junção costuma resolver.
- No plano, olhe
- Exec do segundo row source.
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#15 · SELECT
sql_id 0myxy09ts0my0hv 1937788864Texto
select /*+ index(idl_ub2$12 i_idl_ub21) +*/ piece#,length,piece from idl_ub2$12 where obj#=:1 and part=:2 and version=:3 order by piece#
- 1 IDL_UB2$: operação 1 do plano
- 2 IDL_UB2$, tabela do índice I_IDL_UB21: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,015738 | 95,5 | 2 | |
| cpu | 0,001000 | 6,1 | 2 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000262 | -1,6 | 5 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000069 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000313 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,001000 | 0,015992 | 2 | 7 | 0 | 2 | 0 |
| CLOSE | 1 | 0,000000 | 0,000102 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2317816222
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 1 · TABLE ACCESS BY INDEX ROWID IDL_UB2$ 99,3% do tempo · 40,0% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 2 Id 2 · INDEX RANGE SCAN I_IDL_UB21 0,7% do tempo · 60,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 0,015835 | 99,3 | 2 | 40,0 | 2 | 0 | 0,015948 | 5 | 3 | 227 | ||
| 2 | 2 | 2 | 1 | 0,000113 | 0,7 | 3 | 60,0 | 1 | 0 | 0,000113 | 3 | 2 | 238 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#16 · INSERT
sql_id 0uhffuxsqpvcnhv 1902833044Texto
INSERT INTO TAB_0005 VALUES (:COL_0069, :COL_0070, :COL_0071, :COL_0072)
- 1 operação 1 (LOAD TABLE CONVENTIONAL) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,007998 | 54,9 | 50 | |
| não contabilizado | 0,006013 | 41,2 | 101 | |
| recursivo | 0,000547 | 3,8 | ||
| espera | 0,000019 | 0,1 | 2 | |
| cpu | 0,000000 | 0,0 | 50 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000236 | 0 | 0 | 0 | 0 | 1 |
| EXEC | 50 | 0,008998 | 0,014271 | 2 | 13 | 82 | 50 | 1 |
| CLOSE | 50 | 0,000000 | 0,000070 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 0
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0,000489 | 100,0 | 4 | 100,0 | 2 | 0 | 0,000489 | 4 |
Inserção convencional
LOAD TABLE CONVENTIONAL
Insere as linhas na tabela pelo caminho normal do INSERT.
- Boa quando
- Inserções do dia a dia.
- Ruim quando
- Triggers, índices e constraints da tabela pesam aqui; em carga grande, o modo direto (APPEND) grava mais rápido.
- No plano, olhe
- Tempo próprio (s) e as esperas do comando.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
SQL recursivo executado por este comando
#17 · SELECT
sql_id c1wyt1vcbz2vvhv 3636431739Texto
SELECT COL_0068 FROM ALL_TAB_COLUMNS WHERE OWNER = '***' AND COL_0063 = :B2 AND COL_0067 = :B1
- 1 COL$ não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 13)
- 2 OBJ$ (tabela do índice I_OBJ5) não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 12)
- 3 COLTYPE$ não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 15)
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,006999 | 50,5 | 50 | |
| cpu | 0,003999 | 28,9 | 50 | |
| não contabilizado | 0,002849 | 20,6 | 151 | |
| cpu | 0,000000 | 0,0 | 50 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000032 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 50 | 0,006999 | 0,007635 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 50 | 0,003999 | 0,006109 | 0 | 1.000 | 0 | 50 | 0 |
| CLOSE | 50 | 0,000000 | 0,000071 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2399995316
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 13 · TABLE ACCESS CLUSTER COL$ 16,9% do tempo · 10,0% das leituras lógicas
- 2 Id 12 · INDEX RANGE SCAN I_OBJ5 8,1% do tempo · 15,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 3 Id 15 · TABLE ACCESS CLUSTER COLTYPE$ 4,7% do tempo · 15,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0,000018 | 12,2 | 0 | 0,0 | 0 | 0 | 0,000148 | 20 | ||||||
| 2 | 1 | 1 | 0,000001 | 0,7 | 0 | 0,0 | 0 | 0 | 0,000117 | 16 | 11 | ||||
| 3 | 1 | 1 | 0,000002 | 1,4 | 0 | 0,0 | 0 | 0 | 0,000109 | 15 | 10 | ||||
| 4 | 1 | 1 | 0,000004 | 2,7 | 0 | 0,0 | 0 | 0 | 0,000105 | 15 | 9 | ||||
| 5 | 1 | 1 | 0,000001 | 0,7 | 0 | 0,0 | 0 | 0 | 0,000093 | 13 | 8 | ||||
| 6 | 1 | 1 | 0,000003 | 2,0 | 0 | 0,0 | 0 | 0 | 0,000089 | 13 | 6 | ||||
| 7 | 1 | 1 | 0,000004 | 2,7 | 0 | 0,0 | 0 | 0 | 0,000079 | 10 | 5 | ||||
| 8 | 1 | 1 | 0,000001 | 0,7 | 0 | 0,0 | 0 | 0 | 0,000045 | 6 | 4 | ||||
| 9 | 1 | 1 | 0,000005 | 3,4 | 1 | 5,0 | 0 | 0 | 0,000012 | 2 | 1 | 22 | |||
| 10 | 1 | 1 | 0,000007 | 4,7 | 1 | 5,0 | 0 | 0 | 0,000007 | 1 | 0 | 46 | |||
| 11 | 1 | 1 | 0,000020 | 13,5 | 1 | 5,0 | 0 | 0 | 0,000032 | 4 | 3 | 18 | |||
| 12 | 2 | 1 | 1 | 0,000012 | 8,1 | 3 | 15,0 | 0 | 0 | 0,000012 | 3 | 2 | 40 | ||
| 13 | 1 | 1 | 1 | 0,000025 | 16,9 | 2 | 10,0 | 0 | 0 | 0,000030 | 4 | 1 | 21 | ||
| 14 | 1 | 1 | 0,000005 | 3,4 | 2 | 10,0 | 0 | 0 | 0,000005 | 2 | 0 | 3 | |||
| 15 | 3 | 0 | 1 | 0,000007 | 4,7 | 3 | 15,0 | 0 | 0 | 0,000007 | 3 | 1 | 83 | ||
| 16 | 0 | 1 | 0,000002 | 1,4 | 0 | 0,0 | 0 | 0 | 0,000003 | 0 | 2 | 18 | |||
| 17 | 0 | 1 | 0,000001 | 0,7 | 0 | 0,0 | 0 | 0 | 0,000001 | 0 | 1 | 38 | |||
| 18 | 1 | 1 | 0,000008 | 5,4 | 2 | 10,0 | 0 | 0 | 0,000008 | 2 | 1 | 427 | |||
| 19 | 0 | 1 | 0,000002 | 1,4 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | 1 | 47 | |||
| 20 | 1 | 1 | 0,000007 | 4,7 | 1 | 5,0 | 0 | 0 | 0,000007 | 1 | 1 | 47 | |||
| 21 | 0 | 1 | 0,000010 | 6,8 | 2 | 10,0 | 0 | 0 | 0,000013 | 4 | 2 | 4 | |||
| 22 | 1 | 1 | 0,000003 | 2,0 | 2 | 10,0 | 0 | 0 | 0,000003 | 2 | 1 | 3 | |||
| 23 | 0 | 2 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 24 | 0 | 10 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 62 | |||
| 25 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | ||||
| 26 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | ||||
| 27 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 28 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 47 | |||
| 29 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 39 |
Filtro
FILTER
Aplica um predicado às linhas do row source abaixo. Com dois row sources, executa o segundo (subquery não desaninhada) para cada linha do primeiro.
- Boa quando
- Um row source só, ou subquery executada poucas vezes (o FILTER guarda em cache os resultados já calculados).
- Ruim quando
- Subquery executada linha a linha (Exec alto no segundo row source): permitir o unnesting ou reescrever como junção costuma resolver.
- No plano, olhe
- Exec do segundo row source.
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Tabela interna do Oracle (X$)
FIXED TABLE
Lê uma estrutura de memória do Oracle, por trás das views V$.
- Boa quando
- Consultas pontuais.
- Ruim quando
- Consultas frequentes a V$ grandes (V$SQL, V$SESSION) por rotinas de monitoração.
Skip scan do índice
INDEX SKIP SCAN
Usa um índice composto sem a primeira coluna no filtro: percorre o índice uma vez para cada valor distinto da primeira coluna.
- Boa quando
- A primeira coluna do índice tem poucos valores distintos.
- Ruim quando
- A primeira coluna tem muitos valores: vira quase uma leitura do índice inteiro. Um índice que comece pela coluna filtrada costuma resolver.
- No plano, olhe
- LIO próprio comparado com as Linhas devolvidas.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#18 · SELECT
sql_id 1vybmzupqw75hhv 2876120240Texto
select /*+ index(idl_ub1$12 i_idl_ub11) +*/ piece#,length,piece from idl_ub1$12 where obj#=:1 and part=:2 and version=:3 order by piece#
- 1 IDL_UB1$, tabela do índice I_IDL_UB11: operação 2 do plano
- 2 IDL_UB1$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,011204 | 93,8 | 2 | |
| cpu | 0,001000 | 8,4 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000264 | -2,2 | 5 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000075 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,000388 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,011466 | 2 | 5 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000011 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3246118364
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_IDL_UB11 59,6% do tempo · 75,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · TABLE ACCESS BY INDEX ROWID IDL_UB1$ 40,4% do tempo · 25,0% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 1 | 0,004617 | 40,4 | 1 | 25,0 | 2 | 0 | 0,011438 | 4 | 3 | 225 | ||
| 2 | 1 | 1 | 1 | 0,006821 | 59,6 | 3 | 75,0 | 1 | 0 | 0,006821 | 3 | 2 | 236 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#19 · SELECT
sql_id 7hbqw62s604unhv 2959086420Texto
select /*+ index(idl_sb4$12 i_idl_sb41) +*/ piece#,length,piece from idl_sb4$12 where obj#=:1 and part=:2 and version=:3 order by piece#
- 1 IDL_SB4$: operação 1 do plano
- 2 IDL_SB4$, tabela do índice I_IDL_SB41: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,009431 | 92,2 | 2 | |
| cpu | 0,001000 | 9,8 | 1 | |
| cpu | 0,001000 | 9,8 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,001207 | -11,8 | 6 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000071 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,000428 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 3 | 0,001000 | 0,009712 | 2 | 8 | 0 | 2 | 0 |
| CLOSE | 1 | 0,000000 | 0,000013 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1697022209
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 1 · TABLE ACCESS BY INDEX ROWID IDL_SB4$ 98,7% do tempo · 33,3% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 2 Id 2 · INDEX RANGE SCAN I_IDL_SB41 1,3% do tempo · 66,7% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 0,009537 | 98,7 | 2 | 33,3 | 2 | 0 | 0,009658 | 6 | 3 | 228 | ||
| 2 | 2 | 2 | 1 | 0,000121 | 1,3 | 4 | 66,7 | 1 | 0 | 0,000121 | 4 | 2 | 239 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#20 · SELECT
sql_id 45zgfwwy872t3hv 1015253795Texto
SELECT COUNT(COL_0001) FROM TAB_0002 WHERE COL_0002 = :B2 AND TO_NUMBER(COL_0003) = :B1 AND COL_0001 <> ***
- 1 IDX_0002 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,005163 | 83,6 | 4 | |
| cpu | 0,001000 | 16,2 | 1 | |
| espera | 0,000013 | 0,2 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000060 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,005899 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000214 | 1 | 2 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000003 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 4045997523
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN IDX_0002 100,0% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 1 | 0 | 0,000248 | 2 | ||||||
| 2 | 1 | 58 | 1 | 0,000348 | 100,0 | 2 | 100,0 | 1 | 0 | 0,000348 | 2 | 2 | 188088 |
Agregação (COUNT, SUM, MAX...)
SORT AGGREGATE
Calcula as funções de agregação e devolve uma linha.
- Boa quando
- Barata em si: o custo está nas operações abaixo.
- Ruim quando
- Quase nunca.
- No plano, olhe
- As operações abaixo dela.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#21 · PL/SQL
sql_id 3u48u68wwjg3vhv 969456763Texto
declare
TYPE COL_0021 IS REF CURSOR;
COL_0022 COL_0021;
COL_0023 varchar2(***);
COL_0024 varchar2(***);
COL_0025 varchar2(***);
COL_0026 varchar2(***);
COL_0027 varchar2(***);
COL_0028 varchar2(***);
COL_0029 varchar2(***);
COL_0030 varchar2(***);
COL_0031 NUMBER;
COL_0032 varchar2(***);
COL_0033 varchar2(***);
COL_0034 VARCHAR2(***);
PRAGMA AUTONOMOUS_TRANSACTION;
begin
COL_0028:='***';
execute immediate COL_0028 into COL_0027;
if(not (COL_0027='***' or COL_0027='***' or COL_0027='***' or COL_0027='***'))
then
return;
end if;
COL_0028:='***';
execute immediate COL_0028 into COL_0023;
COL_0028:='***';
execute immediate COL_0028 into COL_0024;
COL_0028:='***';
execute immediate COL_0028 into COL_0026;
COL_0028:='***';
execute immediate COL_0028 into COL_0025;
COL_0028:='***';
execute immediate COL_0028 into COL_0029;
COL_0028:='***';
execute immediate COL_0028 into COL_0034;
if (COL_0025!='***' and COL_0025!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
open COL_0022 for COL_0028 using COL_0025,COL_0029;
loop
fetch COL_0022 into COL_0030;
exit when COL_0022%NOTFOUND;
COL_0028:='***';
execute immediate COL_0028 into COL_0032 using SYS.DBMS_ASSERT.SIMPLE_SQL_NAME(COL_0030);
if (trim(COL_0032)='***')
then
COL_0028:='***';
execute immediate COL_0028 using SYS.DBMS_ASSERT.SCHEMA_NAME(COL_0025),SYS.DBMS_ASSERT.SIMPLE_SQL_NAME(COL_0029),SYS.DBMS_ASSERT.SIMPLE_SQL_NAME(COL_0030);
end if;
end loop;
end if;
if ((COL_0023='***' and COL_0027='***') or (COL_0023='***' and COL_0027='***'))
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028;
commit;
end if;
if (COL_0023='***' and COL_0027='***')
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031 using COL_0025,COL_0029;
if(COL_0031!=***)
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031;
if((COL_0031=***)and (COL_0024!='***' and COL_0024!='***' and COL_0024!='***'and COL_0025!='***' and COL_0025!='***'))
then
COL_0028:='***';
execute immediate COL_0028;
end if;
end if;
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028;
commit;
end if;
if(COL_0024='***' or COL_0024='***' or COL_0024='***'
or COL_0025='***' or COL_0025='***')
then
return;
end if;
if (COL_0023='***' and COL_0027='***')
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031 using COL_0025,COL_0029;
if(COL_0031!=***)
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031;
if(COL_0031=***)
then
COL_0028:='***';
execute immediate COL_0028;
end if;
end if;
end if;
if (COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0033 using COL_0029;
if(COL_0033 is null)
then
return;
end if;
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031;
if(COL_0031=***)
then
COL_0028:='***';
execute immediate COL_0028;
end if;
end if;
if (COL_0027='***' and COL_0023='***')
then
COL_0034:=upper(trim(COL_0034));
if(instr(COL_0034,'***')>*** or instr(COL_0034,'***')>***
or substr(COL_0034,length(COL_0034)-***,***)='***' or substr(COL_0034,length(COL_0034)-***,***)='***' )
then
return;
end if;
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0033 using COL_0029;
if(COL_0033 is null)
then
return;
end if;
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031;
if(COL_0031=***)
then
COL_0028:='***';
execute immediate COL_0028;
end if;
end if;
if (COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0033 using COL_0029;
if(COL_0033 is null)
then
return;
end if;
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028 into COL_0031;
if(COL_0031=***)
then
COL_0028:='***';
execute immediate COL_0028;
end if;
end if;
Exception
when others then
if(sqlcode=-***)
then
COL_0028:=sqlerrm;
COL_0028:=substr(COL_0028,***);
COL_0028:='***'||COL_0028||'***';
execute immediate COL_0028;
end if;
end;
Texto cortado: o trace declara 5977 caracteres.
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,002000 | 51,8 | 1 | |
| recursivo | 0,001438 | 37,2 | ||
| não contabilizado | 0,000425 | 11,0 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000132 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,002999 | 0,003718 | 0 | 0 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000013 | 0 | 0 | 0 | 0 | 0 |
SQL recursivo executado por este comando
#22 · LOCK TABLE
sql_id dsn1ksdx81jd4hv 2055259556Texto
LOCK TABLE "TAB_0005" IN EXCLUSIVE MODE NOWAIT
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,002000 | 55,2 | 1 | |
| recursivo | 0,001435 | 39,6 | ||
| não contabilizado | 0,000190 | 5,2 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,003000 | 0,003593 | 2 | 6 | 0 | 0 | 1 |
| EXEC | 1 | 0,000000 | 0,000024 | 0 | 0 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000008 | 0 | 0 | 0 | 0 | 0 |
SQL recursivo executado por este comando
#23 · SELECT
sql_id 0w81pyhzu3vfjhv 1067576785Texto
select COL_0042, COL_0043 from sys.mon_mods_all$1 where obj# = :COL_0044
- 1 MON_MODS_ALL$, tabela do índice IDX_0008: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| espera | 0,002974 | 92,8 | 1 | |
| não contabilizado | 0,000232 | 7,2 | 4 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000061 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000076 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,003061 | 1 | 2 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000008 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1245710492
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX UNIQUE SCAN IDX_0008 99,9% do tempo · 100,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0,000002 | 0,1 | 0 | 0,0 | 1 | 0 | 0,003060 | 2 | 2 | 463 | |||
| 2 | 1 | 0 | 1 | 0,003058 | 99,9 | 2 | 100,0 | 1 | 0 | 0,003058 | 2 | 1 | 464 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#24 · PL/SQL
sql_id 6tamjm552vthshv 1244522008Texto
declare
TYPE COL_0021 IS REF CURSOR;
COL_0022 COL_0021;
COL_0023 varchar2(***);
COL_0024 varchar2(***);
COL_0025 varchar2(***);
COL_0026 varchar2(***);
COL_0027 varchar2(***);
COL_0029 varchar2(***);
COL_0030 varchar2(***);
COL_0031 NUMBER;
COL_0028 varchar2(***);
COL_0059 varchar2(***);
COL_0060 varchar2(***);
COL_0034 VARCHAR2(***);
begin
COL_0028:='***';
execute immediate COL_0028 into COL_0027;
if(not (COL_0027='***' or COL_0027='***' or COL_0027='***' or COL_0027='***'))
then
return;
end if;
COL_0028:='***';
execute immediate COL_0028 into COL_0023;
COL_0028:='***';
execute immediate COL_0028 into COL_0024;
COL_0028:='***';
execute immediate COL_0028 into COL_0026;
COL_0028:='***';
execute immediate COL_0028 into COL_0025;
COL_0028:='***';
execute immediate COL_0028 into COL_0029;
if((instr(upper(COL_0029),'***')>***) and COL_0023='***')
then
return;
end if;
if (COL_0025!='***' and COL_0025!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
execute immediate COL_0028 into COL_0059 using SYS.DBMS_ASSERT.SCHEMA_NAME(COL_0025),SYS.DBMS_ASSERT.SIMPLE_SQL_NAME(COL_0029);
COL_0059:=trim(COL_0059);
while (length(COL_0059)!=***) loop
if (instr(COL_0059,'***')!=***)
then
COL_0060:=trim(substr(COL_0059,***,instr(COL_0059,'***')-***));
COL_0059:=trim(substr(COL_0059,instr(COL_0059,'***')+***));
else
COL_0060:=trim(COL_0059);
COL_0059:='***';
end if;
COL_0028:='***';
execute immediate COL_0028 using COL_0025||'***'||COL_0029,SYS.DBMS_ASSERT.QUALIFIED_SQL_NAME(COL_0060);
end loop;
return;
end if;
if (COL_0029!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
execute immediate COL_0028;
end if;
if (COL_0025!='***' and COL_0025!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
execute immediate COL_0028;
end if;
if (COL_0025!='***' and COL_0025!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
execute immediate COL_0028;
end if;
if (COL_0025!='***' and COL_0025!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
execute immediate COL_0028;
end if;
if (COL_0025!='***' and COL_0025!='***' and COL_0027='***' and COL_0023='***')
then
COL_0028:='***';
execute immediate COL_0028;
end if;
if (COL_0023='***' and COL_0027='***')
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028;
end if;
if ((COL_0027='***' and COL_0023='***') or (COL_0027='***' and COL_0023='***'))
then
COL_0028:='***';
EXECUTE IMMEDIATE COL_0028;
end if;
Exception
when others then
if(sqlcode=-***)
then
COL_0028:=sqlerrm;
COL_0028:=substr(COL_0028,***);
COL_0028:='***'||COL_0028||'***';
execute immediate COL_0028;
end if;
end;
Texto cortado: o trace declara 3698 caracteres.
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| recursivo | 0,002070 | 67,7 | ||
| não contabilizado | 0,000989 | 32,3 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000038 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,003000 | 0,003001 | 0 | 6 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000020 | 0 | 0 | 0 | 0 | 0 |
SQL recursivo executado por este comando
#25 · PL/SQL
sql_id 0b87xumrqfr04hv 4016528388Texto
BEGIN
BEGIN
IF (sys.ROT_0002(sys.COL_0016, sys.COL_0017, xdb.DBMS_XDBZ.IS_ENABLED_CONTENTS)) THEN
xdb.PKG_0001.ROT_0003(sys.COL_0016, sys.COL_0017);
ELSIF (sys.ROT_0002(sys.COL_0016, sys.COL_0017, xdb.DBMS_XDBZ.IS_ENABLED_RESMETADATA)) THEN
xdb.PKG_0001.ROT_0004(sys.COL_0016, sys.COL_0017);
END IF;
EXCEPTION
WHEN OTHERS THEN
null;
END;
END;
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,003000 | 137,6 | 1 | |
| recursivo | 0,000762 | 34,9 | ||
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,001581 | -72,5 | 3 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000052 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,003000 | 0,002110 | 0 | 12 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000019 | 0 | 0 | 0 | 0 | 0 |
SQL recursivo executado por este comando
#26 · UPDATE
sql_id 0ya7u8w97wkvahv 310266730Texto
update tab$23 set ts#=:2,file#=:3,block#=:4,COL_0055=decode(:5,***,null,:5),tab#=decode(:6,***,null,:6),intcols=:7,kernelcols=:8,clucols=decode(:9,***,null,:9),audit$=:10,flags=:11,pctfree$=:12,pctused$=:13,initrans=:14,maxtrans=:15,rowcnt=:16,blkcnt=:17,empcnt=:18,avgspc=:19,chncnt=:20,avgrln=:21,analyzetime=:22,samplesize=:23,cols=:24,property=:25,degree=decode(:26,***,null,:26),instances=decode(:27,***,null,:27),dataobj#=:28,avgspc_flb=:29,flbcnt=:30,trigflag=:31,spare1=:32,spare2=decode(:33,***,null,:33),spare4=:34,spare6=:35 where obj#=:1
- 1 operação 1 (UPDATE TAB$) não tem objeto próprio no texto
- 2 TAB$, tabela do índice I_OBJ#: operação 3 do plano
- 3 TAB$: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,002000 | 97,4 | 1 | |
| não contabilizado | 0,000053 | 2,6 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000033 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,002000 | 0,002018 | 0 | 3 | 1 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2918346288
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 1 · UPDATE TAB$ 86,1% do tempo · 0,0% das leituras lógicas
- 2 Id 3 · INDEX UNIQUE SCAN I_OBJ# 7,3% do tempo · 66,7% das leituras lógicas
- 3 Id 2 · TABLE ACCESS CLUSTER TAB$ 6,6% do tempo · 33,3% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0,000118 | 86,1 | 0 | 0,0 | 0 | 0 | 0,000137 | 3 | |||||
| 2 | 3 | 1 | 1 | 0,000009 | 6,6 | 1 | 33,3 | 0 | 0 | 0,000019 | 3 | 2 | 4 | ||
| 3 | 2 | 1 | 1 | 0,000010 | 7,3 | 2 | 66,7 | 0 | 0 | 0,000010 | 2 | 1 | 3 |
Alteração
UPDATE
Altera as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais vindas do row source abaixo; índices e triggers da tabela pesam.
- No plano, olhe
- Linhas do row source abaixo.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#27 · CALL
sql_id 6tn90anbghha4hv 385368388Texto
call COL_0035.ROT_0006()
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 63,3 | 1 | |
| recursivo | 0,000521 | 33,0 | ||
| não contabilizado | 0,000060 | 3,8 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000022 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,002000 | 0,001557 | 0 | 6 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
SQL recursivo executado por este comando
#28 · UPDATE
sql_id cr1bq73d78ckphv 3665048149Texto
update seg$13 set type#=:4,blocks=:5,extents=:6,minexts=:7,maxexts=:8,extsize=:9,extpct=:10,user#=:11,iniexts=:12,lists=decode(:13, ***, NULL, :13),groups=decode(:14, ***, NULL, :14), cachehint=:15, hwmincr=:16, spare1=DECODE(:17,***,NULL,:17),scanhint=:18, bitmapranges=:19 where ts#=:1 and file#=:2 and block#=:3
- 1 SEG$, tabela do índice I_FILE#_BLOCK#: operação 3 do plano
- 2 operação 1 (UPDATE SEG$) não tem objeto próprio no texto
- 3 SEG$: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 80,5 | 1 | |
| não contabilizado | 0,000231 | 18,6 | 3 | |
| espera | 0,000011 | 0,9 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000069 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,001171 | 1 | 3 | 1 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2170058777
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 3 · INDEX UNIQUE SCAN I_FILE#_BLOCK# 30,3% do tempo · 66,7% das leituras lógicas
- 2 Id 1 · UPDATE SEG$ 63,4% do tempo · 0,0% das leituras lógicas
- 3 Id 2 · TABLE ACCESS CLUSTER SEG$ 6,3% do tempo · 33,3% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 0,000111 | 63,4 | 0 | 0,0 | 1 | 0 | 0,000175 | 3 | |||||
| 2 | 3 | 1 | 1 | 0,000011 | 6,3 | 1 | 33,3 | 1 | 0 | 0,000064 | 3 | 2 | 14 | ||
| 3 | 1 | 1 | 1 | 0,000053 | 30,3 | 2 | 66,7 | 1 | 0 | 0,000053 | 2 | 1 | 9 |
Alteração
UPDATE
Altera as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais vindas do row source abaixo; índices e triggers da tabela pesam.
- No plano, olhe
- Linhas do row source abaixo.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#29 · UPDATE
sql_id 6j5xzzhqr2067hv 762380487Texto
update obj$ set obj#=:4, type#=:5,ctime=:6,mtime=:7,stime=:8,status=:9,dataobj#=:10,flags=:11,oid$=:12,spare1=:13, spare2=:14 where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is null and subname is null
- 1 I_OBJ2 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
- 2 operação 1 (UPDATE OBJ$) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001999 | 161,1 | 1 | |
| espera | 0,000020 | 1,6 | 2 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000778 | -62,7 | 3 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000039 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001999 | 0,001200 | 2 | 3 | 7 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2683643009
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_OBJ2 3,8% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · UPDATE OBJ$ 96,2% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 0,000482 | 96,2 | 0 | 0,0 | 2 | 0 | 0,000501 | 3 | |||||
| 2 | 1 | 1 | 1 | 0,000019 | 3,8 | 3 | 100,0 | 0 | 0 | 0,000019 | 3 | 3 | 37 |
Alteração
UPDATE
Altera as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais vindas do row source abaixo; índices e triggers da tabela pesam.
- No plano, olhe
- Linhas do row source abaixo.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#31 · SELECT
sql_id 1yjwr52wkx13whv 3106833532Texto
select name,intcol#,segcol#,type#,length,nvl(COL_0014,***),decode(type#,***,nvl(scale,-***/*MAXSB1MINAL*/),***,scale,***,scale,***,scale,***,scale,***,scale,***,scale,***,scale,***),null$,fixedstorage,nvl(deflength,***),default$,rowid,col#,property, nvl(charsetid,***),nvl(charsetform,***),spare1,spare2,nvl(spare3,***) from col$12 where obj#=:1 order by intcol#
- 1 COL$: operação 2 do plano
- 2 COL$, tabela do índice I_OBJ#: operação 3 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000829 | 100,0 | 62 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 56 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000093 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000221 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 56 | 0,000000 | 0,000510 | 0 | 7 | 0 | 54 | 0 |
| CLOSE | 2 | 0,000000 | 0,000005 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3765558045
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · TABLE ACCESS CLUSTER COL$ 92,2% do tempo · 50,0% das leituras lógicas
- 2 Id 3 · INDEX UNIQUE SCAN I_OBJ# 7,8% do tempo · 50,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 50 | 13 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000114 | 4 | 3 | ||||
| 2 | 1 | 50 | 13 | 0,000107 | 92,2 | 2 | 50,0 | 0 | 0 | 0,000116 | 4 | 2 | 21 | ||
| 3 | 2 | 1 | 1 | 0,000009 | 7,8 | 2 | 50,0 | 0 | 0 | 0,000009 | 2 | 1 | 3 |
Ordenação (ORDER BY)
SORT ORDER BY
Ordena as linhas para o ORDER BY.
- Boa quando
- Poucas linhas, ordenação em memória.
- Ruim quando
- Muitas linhas: a ordenação não cabe na workarea e grava no TEMP. Um índice na ordem pedida pode evitar o SORT, principalmente com ROWNUM ou FETCH FIRST.
- No plano, olhe
- PW maior que zero e Tempo próprio (s).
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#32 · SELECT
sql_id bgv44n2yyz7yqhv 3186597846Texto
SELECT /*+ ALL_ROWS */ COUNT(*) FROM DBA_POLICIES V WHERE V.COL_0018 = :B3 AND V.COL_0019 = :B2 AND (V.COL_0020 LIKE '***' OR V.COL_0020 LIKE '***') AND V.FUNCTION = :B1
- 1 I_OBJ5 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 8)
- 2 USER$ não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 6)
- 3 USER$ (tabela do índice I_USER1) não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 7)
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000762 | 100,0 | 7 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000067 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000550 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000138 | 0 | 12 | 0 | 2 | 0 |
| CLOSE | 2 | 0,000000 | 0,000007 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3085502541
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 8 · INDEX RANGE SCAN I_OBJ5 28,7% do tempo · 50,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 6 · TABLE ACCESS BY INDEX ROWID USER$ 12,8% do tempo · 16,7% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 3 Id 7 · INDEX UNIQUE SCAN I_USER1 13,8% do tempo · 16,7% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0,000011 | 11,7 | 0 | 0,0 | 0 | 0 | 0,000094 | 6 | ||||||
| 2 | 0 | 0,000006 | 6,4 | 0 | 0,0 | 0 | 0 | 0,000083 | 6 | ||||||
| 3 | 0 | 1 | 0,000003 | 3,2 | 0 | 0,0 | 0 | 0 | 0,000077 | 6 | 4 | ||||
| 4 | 0 | 1 | 0,000006 | 6,4 | 0 | 0,0 | 0 | 0 | 0,000074 | 6 | 3 | ||||
| 5 | 1 | 1 | 0,000006 | 6,4 | 0 | 0,0 | 0 | 0 | 0,000058 | 5 | 3 | ||||
| 6 | 2 | 1 | 1 | 0,000012 | 12,8 | 1 | 16,7 | 0 | 0 | 0,000025 | 2 | 1 | 22 | ||
| 7 | 3 | 1 | 1 | 0,000013 | 13,8 | 1 | 16,7 | 0 | 0 | 0,000013 | 1 | 0 | 46 | ||
| 8 | 1 | 1 | 1 | 0,000027 | 28,7 | 3 | 50,0 | 0 | 0 | 0,000027 | 3 | 2 | 40 | ||
| 9 | 0 | 1 | 0,000002 | 2,1 | 0 | 0,0 | 0 | 0 | 0,000010 | 1 | 0 | 375 | |||
| 10 | 0 | 1 | 0,000008 | 8,5 | 1 | 16,7 | 0 | 0 | 0,000008 | 1 | 0 | 377 | |||
| 11 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 47 | |||
| 12 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 13 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 47 | |||
| 14 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 39 |
Agregação (COUNT, SUM, MAX...)
SORT AGGREGATE
Calcula as funções de agregação e devolve uma linha.
- Boa quando
- Barata em si: o custo está nas operações abaixo.
- Ruim quando
- Quase nunca.
- No plano, olhe
- As operações abaixo dela.
Filtro
FILTER
Aplica um predicado às linhas do row source abaixo. Com dois row sources, executa o segundo (subquery não desaninhada) para cada linha do primeiro.
- Boa quando
- Um row source só, ou subquery executada poucas vezes (o FILTER guarda em cache os resultados já calculados).
- Ruim quando
- Subquery executada linha a linha (Exec alto no segundo row source): permitir o unnesting ou reescrever como junção costuma resolver.
- No plano, olhe
- Exec do segundo row source.
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Skip scan do índice
INDEX SKIP SCAN
Usa um índice composto sem a primeira coluna no filtro: percorre o índice uma vez para cada valor distinto da primeira coluna.
- Boa quando
- A primeira coluna do índice tem poucos valores distintos.
- Ruim quando
- A primeira coluna tem muitos valores: vira quase uma leitura do índice inteiro. Um índice que comece pela coluna filtrada costuma resolver.
- No plano, olhe
- LIO próprio comparado com as Linhas devolvidas.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#33 · UPDATE
sql_id fncf618xnzg7ghv 995081455Texto
update sys.mon_mods$ set COL_0042 = COL_0042 + :COL_0045, COL_0046 = COL_0046 + :COL_0047, COL_0043 = COL_0043 + :COL_0048, flags = (decode(bitand(flags, :COL_0040), :COL_0040, flags, flags + :COL_0040)), COL_0049 = COL_0049 + :COL_0050, timestamp = :time where obj# = :COL_0044
- 1 IDX_0007 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
- 2 operação 1 (UPDATE MON_MODS$) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 150,4 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000335 | -50,4 | 3 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000042 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,000618 | 0 | 2 | 3 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000005 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 315182377
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX UNIQUE SCAN IDX_0007 3,9% do tempo · 100,0% das leituras lógicas
- 2 Id 1 · UPDATE MON_MODS$ 96,1% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 0,000171 | 96,1 | 0 | 0,0 | 0 | 0 | 0,000178 | 2 | |||||
| 2 | 1 | 1 | 1 | 0,000007 | 3,9 | 2 | 100,0 | 0 | 0 | 0,000007 | 2 | 1 | 462 |
Alteração
UPDATE
Altera as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais vindas do row source abaixo; índices e triggers da tabela pesam.
- No plano, olhe
- Linhas do row source abaixo.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#34 · SELECT
sql_id 22a8nb2z3h5cthv 3191346585Texto
select intcol#,nvl(pos#,***),col#,nvl(spare1,***) from ccol$12 where con#=:1
- 1 CCOL$, tabela do índice I_CCOL1: operação 2 do plano
- 2 CCOL$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000472 | 97,9 | 25 | |
| espera | 0,000010 | 2,1 | 1 | |
| cpu | 0,000000 | 0,0 | 5 | |
| cpu | 0,000000 | 0,0 | 5 | |
| cpu | 0,000000 | 0,0 | 14 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000018 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 5 | 0,000000 | 0,000332 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 14 | 0,000000 | 0,000125 | 1 | 28 | 0 | 9 | 0 |
| CLOSE | 5 | 0,000000 | 0,000007 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3954488388
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_CCOL1 95,3% do tempo · 75,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · TABLE ACCESS BY INDEX ROWID CCOL$ 4,7% do tempo · 25,0% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 1 | 0,000002 | 4,7 | 1 | 25,0 | 1 | 0 | 0,000043 | 4 | 3 | 32 | ||
| 2 | 1 | 1 | 1 | 0,000041 | 95,3 | 3 | 75,0 | 1 | 0 | 0,000041 | 3 | 2 | 57 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#35 · SELECT
sql_id cnhr7ugzaazkdhv 4272258637Texto
select con#,type#,condlength,intcols,robj#,rcon#,COL_0015,refact,nvl(enabled,***),rowid,cols,nvl(defer,***),mtime,nvl(spare1,***),spare2,spare3 from cdef$12 where obj#=:1
- 1 CDEF$, tabela do índice I_CDEF2: operação 2 do plano
- 2 CDEF$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001999 | 414,7 | 2 | |
| espera | 0,000014 | 2,9 | 1 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 7 | |
| cpu | 0,000000 | 0,0 | 2 | |
| não contabilizado | -0,001531 | -317,6 | 13 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000056 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,001999 | 0,000225 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 7 | 0,000000 | 0,000197 | 1 | 14 | 0 | 5 | 0 |
| CLOSE | 2 | 0,000000 | 0,000004 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1932954096
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_CDEF2 100,0% do tempo · 58,3% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · TABLE ACCESS BY INDEX ROWID CDEF$ 0,0% do tempo · 41,7% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 5 | 4 | 0,000000 | 0,0 | 5 | 41,7 | 0 | 0 | 0,000010 | 12 | 2 | 31 | ||
| 2 | 1 | 5 | 4 | 0,000015 | 100,0 | 7 | 58,3 | 0 | 0 | 0,000015 | 7 | 1 | 54 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#36 · SELECT
sql_id 9mrt35hfcpg50hv 483048608Texto
select COL_0035.COL_0036 from dual
- 1 operação 1 (FAST DUAL) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000481 | 100,0 | 4 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000030 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000020 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000428 | 0 | 0 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000003 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 FAST DUAL | 1 | 1 | 0,000002 | 100,0 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#37 · SELECT
sql_id 5mw52nkh2kxhrhv 2687071767Texto
select decode(u.type#, ***, u.ext_username, u.name), o.name, t.update$, t.insert$, t.delete$, t.enabled, decode(bitand(t.property, ***),***, ***, ***), decode(bitand(t.property, ***), ***, ***, ***), decode(bitand(t.property, ***), ***, ***, ***), (select o.name from obj$ o where o.obj# = u.spare2 and o.type# =***) from sys.obj$ o, sys.user$ u, sys.trigger$23 t, sys.obj$ bo where t.baseobject=bo.obj# and bo.name = :1 and bo.spare3 = :2 and bo.namespace = *** and t.obj#=o.obj# and o.owner#=u.user# and o.type# = *** and bitand(property,***)=*** and bitand(property,***)=*** order by o.obj#
- 1 I_OBJ5 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 7)
- 2 TRIGGER$, tabela do índice I_TRIGGER1: operação 9 do plano
- 3 TRIGGER$: operação 8 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000441 | 100,0 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000071 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000261 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000087 | 0 | 10 | 0 | 0 | 0 |
| CLOSE | 2 | 0,000000 | 0,000022 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 515562855
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 7 · INDEX RANGE SCAN I_OBJ5 38,5% do tempo · 60,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 9 · INDEX RANGE SCAN I_TRIGGER1 13,5% do tempo · 40,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 3 Id 8 · TABLE ACCESS BY INDEX ROWID TRIGGER$ 17,3% do tempo · 0,0% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 18 | |||
| 2 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 36 | |||
| 3 | 0 | 1 | 0,000008 | 15,4 | 0 | 0,0 | 0 | 0 | 0,000052 | 5 | 9 | ||||
| 4 | 0 | 1 | 0,000005 | 9,6 | 0 | 0,0 | 0 | 0 | 0,000044 | 5 | 8 | ||||
| 5 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000039 | 5 | 7 | ||||
| 6 | 0 | 1 | 0,000003 | 5,8 | 0 | 0,0 | 0 | 0 | 0,000039 | 5 | 5 | ||||
| 7 | 1 | 1 | 1 | 0,000020 | 38,5 | 3 | 60,0 | 0 | 0 | 0,000020 | 3 | 3 | 40 | ||
| 8 | 3 | 0 | 1 | 0,000009 | 17,3 | 0 | 0,0 | 0 | 0 | 0,000016 | 2 | 2 | 160 | ||
| 9 | 2 | 0 | 2 | 0,000007 | 13,5 | 2 | 40,0 | 0 | 0 | 0,000007 | 2 | 1 | 162 | ||
| 10 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 18 | |||
| 11 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 36 | |||
| 12 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 22 | |||
| 13 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | 11 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Ordenação (ORDER BY)
SORT ORDER BY
Ordena as linhas para o ORDER BY.
- Boa quando
- Poucas linhas, ordenação em memória.
- Ruim quando
- Muitas linhas: a ordenação não cabe na workarea e grava no TEMP. Um índice na ordem pedida pode evitar o SORT, principalmente com ROWNUM ou FETCH FIRST.
- No plano, olhe
- PW maior que zero e Tempo próprio (s).
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#38 · SELECT
sql_id 67mfz4c9y7qk4hv 333699652Texto
select sys.dbms_standard.dictionary_obj_type from dual
- 1 operação 1 (FAST DUAL) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000438 | 100,0 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000040 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000037 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000358 | 0 | 0 | 0 | 2 | 0 |
| CLOSE | 2 | 0,000000 | 0,000003 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 FAST DUAL | 1 | 1 | 0,000002 | 100,0 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#39 · SELECT
sql_id da3h6n1cgu01bhv 1492975659Texto
SELECT COL_0065 FROM TAB_000212 WHERE COL_0002 = :B3 AND TO_NUMBER(COL_0003) = :B2 AND COL_0001 = :B1
- 1 TAB_0002: operação 1 do plano
- 2 TAB_0002, tabela do índice IDX_0002: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 258,4 | 1 | |
| espera | 0,000034 | 8,8 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000647 | -167,2 | 4 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000031 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000190 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,001000 | 0,000165 | 1 | 3 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000001 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3237010533
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 1 · TABLE ACCESS BY INDEX ROWID TAB_0002 77,8% do tempo · 33,3% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 2 Id 2 · INDEX RANGE SCAN IDX_0002 22,2% do tempo · 66,7% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0,000091 | 77,8 | 1 | 33,3 | 1 | 0 | 0,000117 | 3 | 3 | 187749 | ||
| 2 | 2 | 1 | 1 | 0,000026 | 22,2 | 2 | 66,7 | 0 | 0 | 0,000026 | 2 | 2 | 188088 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#42 · SELECT
sql_id 9n37vajy2tqa0hv 2083313984Texto
select col#, grantee#, privilege#,max(mod(nvl(option$,***),***)) from objauth$1 where obj#=:1 and col# is not null group by privilege#, col#, grantee# order by col#, grantee#
- 1 OBJAUTH$, tabela do índice I_OBJAUTH1: operação 3 do plano
- 2 operação 1 (SORT GROUP BY) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000344 | 100,0 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000079 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000215 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000045 | 0 | 6 | 0 | 0 | 0 |
| CLOSE | 2 | 0,000000 | 0,000005 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2874733959
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 3 · INDEX RANGE SCAN I_OBJAUTH1 31,0% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · SORT GROUP BY 62,1% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 1 | 0,000018 | 62,1 | 0 | 0,0 | 0 | 0 | 0,000029 | 3 | 5 | |||
| 2 | 0 | 1 | 0,000002 | 6,9 | 0 | 0,0 | 0 | 0 | 0,000011 | 3 | 4 | 61 | |||
| 3 | 1 | 0 | 1 | 0,000009 | 31,0 | 3 | 100,0 | 0 | 0 | 0,000009 | 3 | 3 | 62 |
Agrupamento por ordenação
SORT GROUP BY
Agrupa as linhas para o GROUP BY ordenando pela chave do grupo.
- Boa quando
- Poucas linhas, ou o resultado precisa sair ordenado.
- Ruim quando
- Muitas linhas, com gravação no TEMP.
- No plano, olhe
- PW e Tempo próprio (s).
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#43 · SELECT
sql_id 88y5z3gq72cmqhv 3966841462Texto
SELECT REPLACE(TO_CHAR(COL_0065), :B3 , '***') FROM TAB_000212 WHERE COL_0002 = :B2 AND TO_NUMBER(COL_0003) = :B1 AND COL_0001 = *** AND COL_0004 = ***
- 1 TAB_0002: operação 1 do plano
- 2 TAB_0002, tabela do índice IDX_0002: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 297,6 | 1 | |
| espera | 0,000010 | 3,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000674 | -200,6 | 4 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000020 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000179 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,001000 | 0,000135 | 1 | 3 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3237010533
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 1 · TABLE ACCESS BY INDEX ROWID TAB_0002 75,0% do tempo · 33,3% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 2 Id 2 · INDEX RANGE SCAN IDX_0002 25,0% do tempo · 66,7% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0,000084 | 75,0 | 1 | 33,3 | 1 | 0 | 0,000112 | 3 | 3 | 187749 | ||
| 2 | 2 | 1 | 1 | 0,000028 | 25,0 | 2 | 66,7 | 0 | 0 | 0,000028 | 2 | 2 | 188088 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#45 · SELECT
sql_id 7pfdb04jkh8qqhv 589832918Texto
select log, sysdate, sysdate+***/***, COL_0040 from sys.mlog$1 where COL_0041 = :1 and master = :2 for update
- 1 MLOG$, tabela do índice I_MLOG#: operação 4 do plano
- 2 operação 2 (BUFFER SORT) não tem objeto próprio no texto
- 3 operação 1 (FOR UPDATE) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000333 | 100,0 | 4 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000035 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000279 | 0 | 1 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000011 | 0 | 0 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000008 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1551139906
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 4 · INDEX UNIQUE SCAN I_MLOG# 17,6% do tempo · 100,0% das leituras lógicas
- 2 Id 2 · BUFFER SORT 51,0% do tempo · 0,0% das leituras lógicas
- 3 Id 1 · FOR UPDATE 25,5% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 3 FOR UPDATE | 0 | 0,000013 | 25,5 | 0 | 0,0 | 0 | 0 | 0,000051 | 1 | |||||
| 2 | 2 | 0 | 0,000026 | 51,0 | 0 | 0,0 | 0 | 0 | 0,000038 | 1 | |||||
| 3 | 0 | 1 | 0,000003 | 5,9 | 0 | 0,0 | 0 | 0 | 0,000012 | 1 | 0 | 627 | |||
| 4 | 1 | 0 | 1 | 0,000009 | 17,6 | 1 | 100,0 | 0 | 0 | 0,000009 | 1 | 0 | 626 |
Guarda da entrada para reúso
BUFFER SORT
Guarda na PGA as linhas do row source abaixo para reaproveitá-las; comum com MERGE JOIN CARTESIAN.
- Boa quando
- Entrada pequena reutilizada várias vezes.
- Ruim quando
- Row source grande, com gravação no TEMP.
- No plano, olhe
- PW: blocos gravados no TEMP.
Acesso à tabela pelo cluster
TABLE ACCESS CLUSTER
Lê a tabela guardada num cluster, pela chave do cluster.
- Boa quando
- Tabelas que são sempre lidas juntas pela mesma chave.
- Ruim quando
- Cluster mal dimensionado, com blocos encadeados.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#46 · SELECT
sql_id by7z8wgv9mw3dhv 4137283693Texto
select con#,obj#,rcon#,enabled,nvl(defer,***),spare2,spare3 from cdef$1 where robj#=:1
- 1 CDEF$, tabela do índice I_CDEF3: operação 2 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 310,6 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| não contabilizado | -0,000678 | -210,6 | 8 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000077 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000193 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,001000 | 0,000048 | 0 | 4 | 0 | 0 | 0 |
| CLOSE | 2 | 0,000000 | 0,000004 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1224215794
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_CDEF3 90,9% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 4 | 0,000003 | 9,1 | 0 | 0,0 | 0 | 0 | 0,000033 | 2 | 2 | 31 | |||
| 2 | 1 | 0 | 1 | 0,000030 | 90,9 | 2 | 100,0 | 0 | 0 | 0,000030 | 2 | 1 | 55 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#47 · SELECT
sql_id 3f4zmq2bz64aphv 2549289301Texto
select grantee#,privilege#,nvl(col#,***),max(mod(nvl(option$,***),***))from objauth$1 where obj#=:1 group by grantee#,privilege#,nvl(col#,***) order by grantee#
- 1 OBJAUTH$, tabela do índice I_OBJAUTH1: operação 3 do plano
- 2 operação 1 (SORT GROUP BY) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000317 | 100,0 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000063 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000221 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000028 | 0 | 6 | 0 | 0 | 0 |
| CLOSE | 2 | 0,000000 | 0,000005 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2874733959
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o último.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 3 · INDEX RANGE SCAN I_OBJAUTH1 42,9% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · SORT GROUP BY 50,0% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 11 | 0,000007 | 50,0 | 0 | 0,0 | 0 | 0 | 0,000014 | 3 | 7 | |||
| 2 | 0 | 11 | 0,000001 | 7,1 | 0 | 0,0 | 0 | 0 | 0,000007 | 3 | 6 | 61 | |||
| 3 | 1 | 0 | 11 | 0,000006 | 42,9 | 3 | 100,0 | 0 | 0 | 0,000006 | 3 | 3 | 62 |
Agrupamento por ordenação
SORT GROUP BY
Agrupa as linhas para o GROUP BY ordenando pela chave do grupo.
- Boa quando
- Poucas linhas, ou o resultado precisa sair ordenado.
- Ruim quando
- Muitas linhas, com gravação no TEMP.
- No plano, olhe
- PW e Tempo próprio (s).
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#48 · SELECT
sql_id bfqbtz6bkwrpfhv 2536398510Texto
select obj#,type#,ctime,mtime,stime, status, dataobj#, flags, oid$, spare1, spare2 from obj$12 where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is null and subname is null
- 1 OBJ$, tabela do índice I_OBJ2: operação 2 do plano
- 2 OBJ$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 318,5 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000686 | -218,5 | 4 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000038 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,000206 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000021 | 0 | 4 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000049 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2853959010
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_OBJ2 71,4% do tempo · 75,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · TABLE ACCESS BY INDEX ROWID OBJ$ 28,6% do tempo · 25,0% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 1 | 0,000006 | 28,6 | 1 | 25,0 | 0 | 0 | 0,000021 | 4 | 4 | 18 | ||
| 2 | 1 | 1 | 1 | 0,000015 | 71,4 | 3 | 75,0 | 0 | 0 | 0,000015 | 3 | 3 | 37 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#49 · SELECT
sql_id bfth5k6ryjz9vhv 2951281979Texto
select *** from sys.cdc_change_tables$1 where COL_0037 = :1 and COL_0038 = :2 and bitand(COL_0039, ***)=***
- 1 CDC_CHANGE_TABLES$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000276 | 100,0 | 4 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000037 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000184 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000046 | 0 | 1 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000009 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 626680409
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0,000045 | 100,0 | 1 | 100,0 | 0 | 0 | 0,000045 | 1 | 2 | 669 |
Leitura completa da tabela (full table scan)
TABLE ACCESS FULL
Lê todos os blocos do segmento até a high water mark (HWM), com multiblock reads (db file scattered read, ou direct path read na leitura direta).
- Boa quando
- A consulta precisa de boa parte das linhas, a tabela é pequena, ou a leitura é em lote. No Exadata (STORAGE FULL) o filtro roda nas células de armazenamento (smart scan).
- Ruim quando
- O predicado é seletivo e sobram poucas linhas: o custo cresce com o tamanho do segmento, não com o resultado. Pior como inner de um NESTED LOOPS: o full scan se repete para cada linha do outer.
- No plano, olhe
- LIO próprio alto com poucas Linhas devolvidas: predicado seletivo sem índice útil. Exec maior que 1: full scan repetido.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#50 · SELECT
sql_id gpynzftxc4j44hv 2059551876Texto
select sys.dbms_standard.dictionary_obj_owner from dual
- 1 operação 1 (FAST DUAL) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,000999 | 362,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| não contabilizado | -0,000723 | -262,0 | 8 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000999 | 0,000092 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000030 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000150 | 0 | 0 | 0 | 2 | 0 |
| CLOSE | 2 | 0,000000 | 0,000004 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 FAST DUAL | 1 | 1 | 0,000001 | 100,0 | 0 | 0,0 | 0 | 0 | 0,000001 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#51 · SELECT
sql_id c16vprkufws0zhv 3035521055Texto
select COL_0042, COL_0043 from sys.mon_mods$12 where obj# = :COL_0044
- 1 MON_MODS$, tabela do índice IDX_0007: operação 2 do plano
- 2 MON_MODS$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000253 | 92,3 | 4 | |
| espera | 0,000021 | 7,7 | 2 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000060 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000096 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000111 | 2 | 3 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000007 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3381929193
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX UNIQUE SCAN IDX_0007 58,2% do tempo · 66,7% das leituras lógicas
- 2 Id 1 · TABLE ACCESS BY INDEX ROWID MON_MODS$ 41,8% do tempo · 33,3% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 1 | 0,000046 | 41,8 | 1 | 33,3 | 2 | 0 | 0,000110 | 3 | 1 | 461 | ||
| 2 | 1 | 1 | 1 | 0,000064 | 58,2 | 2 | 66,7 | 1 | 0 | 0,000064 | 2 | 1 | 462 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#52 · SELECT
sql_id 19u4kfhhtg8m2hv 563585634Texto
select count(COL_0010) from SYS_FBA_TRACKEDTABLES1 where OBJ# = *** and bitand(FLAGS, ***)=***
- 1 SYS_FBA_TRACKEDTABLES, tabela do índice SYS_C001489: operação 3 do plano
- 2 operação 1 (SORT AGGREGATE) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000266 | 100,0 | 7 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000134 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000082 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000041 | 0 | 2 | 0 | 2 | 0 |
| CLOSE | 1 | 0,000000 | 0,000009 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 977911507
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 3 · INDEX UNIQUE SCAN SYS_C001489 41,7% do tempo · 100,0% das leituras lógicas
- 2 Id 1 · SORT AGGREGATE 50,0% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 0,000018 | 50,0 | 0 | 0,0 | 0 | 0 | 0,000036 | 1 | |||||
| 2 | 0 | 1 | 0,000003 | 8,3 | 0 | 0,0 | 0 | 0 | 0,000018 | 1 | 1 | 1271 | |||
| 3 | 1 | 0 | 1 | 0,000015 | 41,7 | 1 | 100,0 | 0 | 0 | 0,000015 | 1 | 0 | 1272 |
Agregação (COUNT, SUM, MAX...)
SORT AGGREGATE
Calcula as funções de agregação e devolve uma linha.
- Boa quando
- Barata em si: o custo está nas operações abaixo.
- Ruim quando
- Quase nunca.
- No plano, olhe
- As operações abaixo dela.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#53 · SELECT
sql_id 959uydc7rvscghv 259907983Texto
SELECT COUNT(*) FROM TAB_00061 WHERE COL_0061 = :1 AND COL_0062 = :2
- 1 TAB_0006, tabela do índice IDX_0010: operação 3 do plano
- 2 operação 1 (SORT AGGREGATE) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 420,2 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000762 | -320,2 | 4 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000022 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,001000 | 0,000197 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000017 | 0 | 1 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 3216348639
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 3 · INDEX RANGE SCAN IDX_0010 38,5% do tempo · 100,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · SORT AGGREGATE 50,0% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 0,000013 | 50,0 | 0 | 0,0 | 0 | 0 | 0,000026 | 1 | |||||
| 2 | 0 | 1 | 0,000003 | 11,5 | 0 | 0,0 | 0 | 0 | 0,000013 | 1 | 0 | 68054 | |||
| 3 | 1 | 0 | 1 | 0,000010 | 38,5 | 1 | 100,0 | 0 | 0 | 0,000010 | 1 | 0 | 68057 |
Agregação (COUNT, SUM, MAX...)
SORT AGGREGATE
Calcula as funções de agregação e devolve uma linha.
- Boa quando
- Barata em si: o custo está nas operações abaixo.
- Ruim quando
- Quase nunca.
- No plano, olhe
- As operações abaixo dela.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#54 · PL/SQL
sql_id 7umwgdhcjkfaphv 421083477Texto
BEGIN ROT_0005(COL_0056, COL_0057, COL_0058); END;
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 434,8 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000770 | -334,8 | 3 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,001000 | 0,000060 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000155 | 0 | 0 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000015 | 0 | 0 | 0 | 0 | 0 |
#55 · SELECT
sql_id abk1nyq2wk8v2hv 2244551522Texto
select sys.dbms_standard.sysevent from dual
- 1 operação 1 (FAST DUAL) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000227 | 100,0 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000035 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000029 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000159 | 0 | 0 | 0 | 2 | 0 |
| CLOSE | 2 | 0,000000 | 0,000004 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 FAST DUAL | 1 | 1 | 0,000001 | 100,0 | 0 | 0,0 | 0 | 0 | 0,000001 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#56 · SELECT
sql_id d6bv6ggpfz7qjhv 3941572305Texto
select sys.dbms_standard.dictionary_obj_name from dual
- 1 operação 1 (FAST DUAL) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000210 | 100,0 | 8 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 | |
| cpu | 0,000000 | 0,0 | 2 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 2 | 0,000000 | 0,000035 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 2 | 0,000000 | 0,000029 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 2 | 0,000000 | 0,000141 | 0 | 0 | 0 | 2 | 0 |
| CLOSE | 2 | 0,000000 | 0,000005 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 FAST DUAL | 1 | 1 | 0,000002 | 100,0 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#58 · SELECT
sql_id 710z58sn2nkt9hv 673860393Texto
SELECT COUNT(*) FROM MDSYS.TAB_0007 WHERE COL_0061 = :1 AND COL_0063 = :2
- 1 IDX_0011 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
- 2 operação 1 (SORT AGGREGATE) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000178 | 100,0 | 4 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000020 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000149 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000007 | 0 | 0 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 144376333
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN IDX_0011 57,1% do tempo · 0,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · SORT AGGREGATE 42,9% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 1 | 0,000015 | 42,9 | 0 | 0,0 | 0 | 0 | 0,000035 | 0 | |||||
| 2 | 1 | 0 | 1 | 0,000020 | 57,1 | 0 | 0,0 | 0 | 0 | 0,000020 | 0 | 0 | 68536 |
Agregação (COUNT, SUM, MAX...)
SORT AGGREGATE
Calcula as funções de agregação e devolve uma linha.
- Boa quando
- Barata em si: o custo está nas operações abaixo.
- Ruim quando
- Quase nunca.
- No plano, olhe
- As operações abaixo dela.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#59 · SELECT
sql_id b5sr13avtw1wahv 3080587146Texto
select pos#,intcol#,col#,spare1,bo#,spare2,spare3 from icol$12 where obj#=:1
- 1 ICOL$, tabela do índice I_ICOL1: operação 2 do plano
- 2 ICOL$: operação 1 do plano
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000175 | 100,0 | 9 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 6 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000047 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000080 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 6 | 0,000000 | 0,000046 | 0 | 12 | 0 | 5 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 299250003
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX RANGE SCAN I_ICOL1 100,0% do tempo · 58,3% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 1 · TABLE ACCESS BY INDEX ROWID ICOL$ 0,0% do tempo · 41,7% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 5 | 2 | 0,000000 | 0,0 | 5 | 41,7 | 0 | 0 | 0,000017 | 12 | 2 | 20 | ||
| 2 | 1 | 5 | 2 | 0,000024 | 100,0 | 7 | 58,3 | 0 | 0 | 0,000024 | 7 | 1 | 42 |
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#60 · SELECT
2 variantesTexto
select SYS_CONTEXT(:s,:s) from dual
- 1 operação 1 (FAST DUAL) não tem objeto próprio no texto
Texto da forma: os literais viraram :s (texto) e :n (número).
Variantes que mais gastaram
| Chamadas | Inclusivo (s) | Literais |
|---|---|---|
| 8 | 0,000 | '***', '***' |
| 4 | 0,000 | '***', '***' |
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000168 | 100,0 | 12 | |
| cpu | 0,000000 | 0,0 | 3 | |
| cpu | 0,000000 | 0,0 | 3 | |
| cpu | 0,000000 | 0,0 | 3 | |
| cpu | 0,000000 | 0,0 | 3 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 3 | 0,000000 | 0,000067 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 3 | 0,000000 | 0,000040 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 3 | 0,000000 | 0,000054 | 0 | 0 | 0 | 3 | 0 |
| CLOSE | 3 | 0,000000 | 0,000007 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace; plano gravado 2 vezes, mostrando o da gravação mais demorada.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 FAST DUAL | 1 | 1 | 0,000002 | 100,0 | 0 | 0,0 | 0 | 0 | 0,000002 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#61 · DELETE
sql_id 0wcdzux2jrnaahv 1159450954Texto
delete from superobj$ where COL_0054 = :1
- 1 I_SUPEROBJ1 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
- 2 operação 1 (DELETE SUPEROBJ$) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000160 | 100,0 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000052 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000103 | 0 | 1 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000005 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2453887050
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX UNIQUE SCAN I_SUPEROBJ1 75,0% do tempo · 100,0% das leituras lógicas
- 2 Id 1 · DELETE SUPEROBJ$ 25,0% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 0,000002 | 25,0 | 0 | 0,0 | 0 | 0 | 0,000008 | 1 | |||||
| 2 | 1 | 0 | 1 | 0,000006 | 75,0 | 1 | 100,0 | 0 | 0 | 0,000006 | 1 | 0 | 72 |
Exclusão
DELETE
Apaga as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais; chave estrangeira sem índice na tabela filha trava a tabela inteira.
- No plano, olhe
- Linhas do row source abaixo.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#62 · DELETE
sql_id 75x8vfbd29wathv 3659854169Texto
delete from tab_stats$ where obj#=:1
- 1 IDX_0009 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 2)
- 2 operação 1 (DELETE TAB_STATS$) não tem objeto próprio no texto
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000132 | 100,0 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000028 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000095 | 0 | 1 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000009 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 2667651180
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 2 · INDEX UNIQUE SCAN IDX_0009 71,4% do tempo · 100,0% das leituras lógicas
- 2 Id 1 · DELETE TAB_STATS$ 28,6% do tempo · 0,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 0,000002 | 28,6 | 0 | 0,0 | 0 | 0 | 0,000007 | 1 | |||||
| 2 | 1 | 0 | 1 | 0,000005 | 71,4 | 1 | 100,0 | 0 | 0 | 0,000005 | 1 | 0 | 431 |
Exclusão
DELETE
Apaga as linhas que o row source abaixo devolveu.
- Boa quando
- Poucas linhas, encontradas por índice.
- Ruim quando
- Linhas demais; chave estrangeira sem índice na tabela filha trava a tabela inteira.
- No plano, olhe
- Linhas do row source abaixo.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#63 · SELECT
sql_id 0jgs3t6330f5bhv 2251307179Texto
select sys.dbms_standard.login_user from dual
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| cpu | 0,001000 | 787,4 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| não contabilizado | -0,000873 | -687,4 | 4 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000021 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000010 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,001000 | 0,000094 | 0 | 0 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000002 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1388734953
Das linhas STAT do trace.
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | FAST DUAL | 1 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 |
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#64 · SELECT
sql_id gxm90qnbtvr9thv 396221753Texto
SELECT COUNT(*) FROM ALL_VIEWS WHERE OWNER = '***' AND COL_0064 = '***'
- 1 I_OBJ5 não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 8)
- 2 USER$ não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 6)
- 3 USER$ (tabela do índice I_USER1) não aparece no texto; vem de uma view, de um sinônimo ou de SQL recursivo (operação 7)
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000105 | 100,0 | 4 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000020 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000048 | 0 | 0 | 0 | 0 | 0 |
| FETCH | 1 | 0,000000 | 0,000036 | 0 | 5 | 0 | 1 | 0 |
| CLOSE | 1 | 0,000000 | 0,000001 | 0 | 0 | 0 | 0 | 0 |
Plano de execução 1166547797
Das linhas STAT do trace.
Onde o plano gasta pelo valor próprio de cada operação, sem o das operações abaixo dela
- 1 Id 8 · INDEX RANGE SCAN I_OBJ5 34,9% do tempo · 60,0% das leituras lógicas
Percorre uma faixa larga do índice: confira a seletividade e a ordem das colunas. - 2 Id 6 · TABLE ACCESS BY INDEX ROWID USER$ 11,6% do tempo · 20,0% das leituras lógicas
Visita a tabela linha a linha a partir do índice: índice pouco seletivo ou sem as colunas que o filtro usa. - 3 Id 7 · INDEX UNIQUE SCAN I_USER1 18,6% do tempo · 20,0% das leituras lógicas
| Id | Operação | Exec. | Linhas | Linhas/exec | Estimado | Tempo próprio (s) | % tempo | LIO próprio | % LIO | PR | PW | Tempo (s) | CR | Custo | obj |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0,000008 | 18,6 | 0 | 0,0 | 0 | 0 | 0,000043 | 5 | ||||||
| 2 | 0 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000035 | 5 | ||||||
| 3 | 0 | 1 | 0,000002 | 4,7 | 0 | 0,0 | 0 | 0 | 0,000035 | 5 | 4 | ||||
| 4 | 0 | 1 | 0,000003 | 7,0 | 0 | 0,0 | 0 | 0 | 0,000033 | 5 | 3 | ||||
| 5 | 0 | 1 | 0,000002 | 4,7 | 0 | 0,0 | 0 | 0 | 0,000030 | 5 | 3 | ||||
| 6 | 2 | 1 | 1 | 0,000005 | 11,6 | 1 | 20,0 | 0 | 0 | 0,000013 | 2 | 1 | 22 | ||
| 7 | 3 | 1 | 1 | 0,000008 | 18,6 | 1 | 20,0 | 0 | 0 | 0,000008 | 1 | 0 | 46 | ||
| 8 | 1 | 0 | 1 | 0,000015 | 34,9 | 3 | 60,0 | 0 | 0 | 0,000015 | 3 | 2 | 40 | ||
| 9 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | 75 | |||
| 10 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 47 | |||
| 11 | 0 | 2 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 12 | 0 | 10 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | 62 | |||
| 13 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | ||||
| 14 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 0 | ||||
| 15 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 3 | ||||
| 16 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 1 | 47 | |||
| 17 | 0 | 1 | 0,000000 | 0,0 | 0 | 0,0 | 0 | 0 | 0,000000 | 0 | 2 | 39 |
Agregação (COUNT, SUM, MAX...)
SORT AGGREGATE
Calcula as funções de agregação e devolve uma linha.
- Boa quando
- Barata em si: o custo está nas operações abaixo.
- Ruim quando
- Quase nunca.
- No plano, olhe
- As operações abaixo dela.
Filtro
FILTER
Aplica um predicado às linhas do row source abaixo. Com dois row sources, executa o segundo (subquery não desaninhada) para cada linha do primeiro.
- Boa quando
- Um row source só, ou subquery executada poucas vezes (o FILTER guarda em cache os resultados já calculados).
- Ruim quando
- Subquery executada linha a linha (Exec alto no segundo row source): permitir o unnesting ou reescrever como junção costuma resolver.
- No plano, olhe
- Exec do segundo row source.
Junção em laço (nested loops)
NESTED LOOPS
Para cada linha do row source externo (outer, driving), executa o row source interno (inner).
- Boa quando
- Poucas linhas no outer e acesso seletivo por índice no inner. Devolve as primeiras linhas rápido (bom para FIRST_ROWS).
- Ruim quando
- Muitas linhas no outer: o inner executa milhares de vezes. Costuma vir de cardinalidade subestimada no outer; um HASH JOIN leria cada lado uma vez só.
- No plano, olhe
- Exec das operações do inner e, no outer, Estimado comparado com Linhas/exec.
Acesso à tabela pelo ROWID do índice
TABLE ACCESS BY INDEX ROWID
Acessa a tabela, uma linha por vez, pelos ROWIDs que o index scan logo abaixo devolveu.
- Boa quando
- Poucas linhas, ou linhas guardadas perto umas das outras na tabela (clustering factor baixo).
- Ruim quando
- Muitas linhas espalhadas (clustering factor alto): quase um bloco lido por linha. Ou um filter predicate aplicado só aqui, que descarta a maior parte do que o índice trouxe: falta no índice a coluna desse predicado.
- No plano, olhe
- Linhas desta operação comparadas com as do index scan logo abaixo: se aqui sobram bem menos, o filtro está na tabela e não no índice.
Busca por chave única
INDEX UNIQUE SCAN
Busca uma única chave num índice único (PK ou UNIQUE): desce do root block pelos branch blocks até o leaf block da chave.
- Boa quando
- Quase sempre: lê só a altura do índice (BLEVEL + 1 blocos).
- Ruim quando
- Como inner de um NESTED LOOPS com milhões de linhas no outer: barato por execução, caro no total.
- No plano, olhe
- Exec: milhares de execuções pesam mesmo com LIO próprio baixo em cada uma.
Varredura de faixa do índice
INDEX RANGE SCAN
Desce até o primeiro leaf block da faixa e percorre em ordem os leaf blocks dentro da faixa definida pelo access predicate.
- Boa quando
- Faixa estreita: o access predicate usa as colunas iniciais do índice com igualdade e sobram poucas chaves.
- Ruim quando
- Faixa larga (muitos leaf blocks), predicado que não usa a coluna inicial do índice (vira filter predicate dentro do índice), ou muitas execuções como inner de um NESTED LOOPS. Se o TABLE ACCESS acima descarta quase tudo, falta no índice a coluna do filtro.
- No plano, olhe
- Linhas devolvidas e LIO próprio, comparados com os da operação de tabela logo acima.
Tabela interna do Oracle (X$)
FIXED TABLE
Lê uma estrutura de memória do Oracle, por trás das views V$.
- Boa quando
- Consultas pontuais.
- Ruim quando
- Consultas frequentes a V$ grandes (V$SQL, V$SESSION) por rotinas de monitoração.
Skip scan do índice
INDEX SKIP SCAN
Usa um índice composto sem a primeira coluna no filtro: percorre o índice uma vez para cada valor distinto da primeira coluna.
- Boa quando
- A primeira coluna do índice tem poucos valores distintos.
- Ruim quando
- A primeira coluna tem muitos valores: vira quase uma leitura do índice inteiro. Um índice que comece pela coluna filtrada costuma resolver.
- No plano, olhe
- LIO próprio comparado com as Linhas devolvidas.
Clique numa operação para ver o que ela faz, quando é boa, quando é ruim e que colunas do plano conferir. Tempo (s) e CR são acumulados: incluem as operações abaixo de cada uma (os row sources de entrada); os valores próprios descontam essas operações. O Oracle mede o tempo por operação por amostragem, então ele pode não fechar entre uma operação e as de baixo; as leituras lógicas são contadas sempre. Linhas/exec e Estimado em vermelho: o otimizador errou a cardinalidade por 10 vezes ou mais.
#65 · LOCK TABLE
sql_id 427fd0f4ay3ryhv 2293174014Texto
lock table sys.mon_mods$ in exclusive mode nowait
Perfil do comando
| Componente | Duração (s) | % | Ocorrências | |
|---|---|---|---|---|
| não contabilizado | 0,000072 | 100,0 | 3 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 | |
| cpu | 0,000000 | 0,0 | 1 |
Chamadas
| Chamada | Quantidade | CPU (s) | Duração (s) | Disco (PIO) | Consistente (CR) | Corrente (CU) | Linhas | Misses |
|---|---|---|---|---|---|---|---|---|
| PARSE | 1 | 0,000000 | 0,000054 | 0 | 0 | 0 | 0 | 0 |
| EXEC | 1 | 0,000000 | 0,000015 | 0 | 0 | 0 | 0 | 0 |
| CLOSE | 1 | 0,000000 | 0,000003 | 0 | 0 | 0 | 0 | 0 |
Objeto 188047 · IDX_0001
índice- Espera (s)
- 0,931
- Ocorrências
- 1.877
- Eventos principais
- db file sequential read · Disk file operations I/O
Onde aparece no trace
- Comando #7, operação 2 INDEX FULL SCAN IDX_0001
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 187750
- Espera (s)
- 0,165
- Ocorrências
- 18.336
- Eventos principais
- direct path read
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 1008999 · TAB_0005
tabela- Espera (s)
- 0,023
- Ocorrências
- 17
- Eventos principais
- enq: RO - fast object reuse · local write wait · reliable message
Onde aparece no trace
- Comando #1, operação 2 TABLE ACCESS FULL TAB_0005
- Comando #2, operação 2 TABLE ACCESS FULL TAB_0005
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 226 · IDL_CHAR$
tabela- Espera (s)
- 0,017
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #12, operação 1 TABLE ACCESS BY INDEX ROWID IDL_CHAR$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 107 · I_DEPENDENCY2
índice- Espera (s)
- 0,016
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #14, operação 7 INDEX RANGE SCAN I_DEPENDENCY2
- Comando #14, operação 14 INDEX RANGE SCAN I_DEPENDENCY2
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 227 · IDL_UB2$
tabela- Espera (s)
- 0,016
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #15, operação 1 TABLE ACCESS BY INDEX ROWID IDL_UB2$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 427 · IDX_0012
índice- Espera (s)
- 0,010
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #11, operação 28 INDEX RANGE SCAN IDX_0012
- Comando #17, operação 18 INDEX RANGE SCAN IDX_0012
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 228 · IDL_SB4$
tabela- Espera (s)
- 0,009
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #19, operação 1 TABLE ACCESS BY INDEX ROWID IDL_SB4$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 31 · CDEF$
tabela- Espera (s)
- 0,008
- Ocorrências
- 2
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #13, operação 10 TABLE ACCESS BY INDEX ROWID CDEF$
- Comando #35, operação 1 TABLE ACCESS BY INDEX ROWID CDEF$
- Comando #46, operação 1 TABLE ACCESS BY INDEX ROWID CDEF$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 19 · IND$
tabela- Espera (s)
- 0,008
- Ocorrências
- 3
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #13, operação 4 TABLE ACCESS CLUSTER IND$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 237 · I_IDL_CHAR1
índice- Espera (s)
- 0,007
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #12, operação 2 INDEX RANGE SCAN I_IDL_CHAR1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 236 · I_IDL_UB11
índice- Espera (s)
- 0,007
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #18, operação 2 INDEX RANGE SCAN I_IDL_UB11
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 187694
- Espera (s)
- 0,006
- Ocorrências
- 49
- Eventos principais
- db file sequential read
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 40 · I_OBJ5
índice- Espera (s)
- 0,005
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #11, operação 22 INDEX RANGE SCAN I_OBJ5
- Comando #17, operação 12 INDEX RANGE SCAN I_OBJ5
- Comando #32, operação 8 INDEX RANGE SCAN I_OBJ5
- Comando #37, operação 7 INDEX RANGE SCAN I_OBJ5
- Comando #64, operação 8 INDEX RANGE SCAN I_OBJ5
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 225 · IDL_UB1$
tabela- Espera (s)
- 0,004
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #18, operação 1 TABLE ACCESS BY INDEX ROWID IDL_UB1$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 464 · IDX_0008
índice- Espera (s)
- 0,003
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #23, operação 2 INDEX UNIQUE SCAN IDX_0008
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 384
- Espera (s)
- 0,001
- Ocorrências
- 4
- Eventos principais
- SQL*Net message from client · SQL*Net message to client
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 650598
- Espera (s)
- 0,000
- Ocorrências
- 2
- Eventos principais
- db file sequential read · Disk file operations I/O
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 187749 · TAB_0002
tabela- Espera (s)
- 0,000
- Ocorrências
- 2
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #39, operação 1 TABLE ACCESS BY INDEX ROWID TAB_0002
- Comando #43, operação 1 TABLE ACCESS BY INDEX ROWID TAB_0002
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 239 · I_IDL_SB41
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #19, operação 2 INDEX RANGE SCAN I_IDL_SB41
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 3 · I_OBJ#
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #11, operação 24 INDEX UNIQUE SCAN I_OBJ#
- Comando #11, operação 32 INDEX UNIQUE SCAN I_OBJ#
- Comando #13, operação 5 INDEX UNIQUE SCAN I_OBJ#
- Comando #17, operação 14 INDEX UNIQUE SCAN I_OBJ#
- Comando #17, operação 22 INDEX UNIQUE SCAN I_OBJ#
- Comando #26, operação 3 INDEX UNIQUE SCAN I_OBJ#
- Comando #31, operação 3 INDEX UNIQUE SCAN I_OBJ#
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 54 · I_CDEF2
índice- Espera (s)
- 0,000
- Ocorrências
- 2
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #13, operação 11 INDEX RANGE SCAN I_CDEF2
- Comando #35, operação 2 INDEX RANGE SCAN I_CDEF2
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 18 · OBJ$
tabela- Espera (s)
- 0,000
- Ocorrências
- 2
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #11, operação 1 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #11, operação 3 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #11, operação 5 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #11, operação 7 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #11, operação 9 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #11, operação 21 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #11, operação 26 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #14, operação 9 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #14, operação 16 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #17, operação 11 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #17, operação 16 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #37, operação 1 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #37, operação 10 TABLE ACCESS BY INDEX ROWID OBJ$
- Comando #48, operação 1 TABLE ACCESS BY INDEX ROWID OBJ$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 187751
- Espera (s)
- 0,000
- Ocorrências
- 2
- Eventos principais
- db file sequential read · direct path read
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 462 · IDX_0007
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #33, operação 2 INDEX UNIQUE SCAN IDX_0007
- Comando #51, operação 2 INDEX UNIQUE SCAN IDX_0007
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 188088 · IDX_0002
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #20, operação 2 INDEX RANGE SCAN IDX_0002
- Comando #39, operação 2 INDEX RANGE SCAN IDX_0002
- Comando #41, operação 2 (sem detalhe neste arquivo) INDEX RANGE SCAN IDX_0002
- Comando #43, operação 2 INDEX RANGE SCAN IDX_0002
- Comando #44, operação 2 (sem detalhe neste arquivo) INDEX RANGE SCAN IDX_0002
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 39 · I_OBJ4
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #11, operação 39 INDEX RANGE SCAN I_OBJ4
- Comando #17, operação 29 INDEX RANGE SCAN I_OBJ4
- Comando #32, operação 14 INDEX RANGE SCAN I_OBJ4
- Comando #64, operação 17 INDEX RANGE SCAN I_OBJ4
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 238 · I_IDL_UB21
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #15, operação 2 INDEX RANGE SCAN I_IDL_UB21
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 9 · I_FILE#_BLOCK#
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #28, operação 3 INDEX UNIQUE SCAN I_FILE#_BLOCK#
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 57 · I_CCOL1
índice- Espera (s)
- 0,000
- Ocorrências
- 1
- Eventos principais
- db file sequential read
Onde aparece no trace
- Comando #34, operação 2 INDEX RANGE SCAN I_CCOL1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 36 · I_OBJ1
índiceOnde aparece no trace
- Comando #11, operação 2 INDEX RANGE SCAN I_OBJ1
- Comando #11, operação 4 INDEX RANGE SCAN I_OBJ1
- Comando #11, operação 6 INDEX RANGE SCAN I_OBJ1
- Comando #11, operação 8 INDEX RANGE SCAN I_OBJ1
- Comando #11, operação 10 INDEX RANGE SCAN I_OBJ1
- Comando #14, operação 8 INDEX RANGE SCAN I_OBJ1
- Comando #14, operação 15 INDEX RANGE SCAN I_OBJ1
- Comando #37, operação 2 INDEX RANGE SCAN I_OBJ1
- Comando #37, operação 11 INDEX RANGE SCAN I_OBJ1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 22 · USER$
tabelaOnde aparece no trace
- Comando #11, operação 19 TABLE ACCESS BY INDEX ROWID USER$
- Comando #17, operação 9 TABLE ACCESS BY INDEX ROWID USER$
- Comando #32, operação 6 TABLE ACCESS BY INDEX ROWID USER$
- Comando #37, operação 12 TABLE ACCESS CLUSTER USER$
- Comando #64, operação 6 TABLE ACCESS BY INDEX ROWID USER$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 46 · I_USER1
índiceOnde aparece no trace
- Comando #11, operação 20 INDEX UNIQUE SCAN I_USER1
- Comando #17, operação 10 INDEX UNIQUE SCAN I_USER1
- Comando #32, operação 7 INDEX UNIQUE SCAN I_USER1
- Comando #64, operação 7 INDEX UNIQUE SCAN I_USER1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 21 · COL$
tabelaOnde aparece no trace
- Comando #11, operação 23 TABLE ACCESS CLUSTER COL$
- Comando #17, operação 13 TABLE ACCESS CLUSTER COL$
- Comando #31, operação 2 TABLE ACCESS CLUSTER COL$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 83 · COLTYPE$
tabelaOnde aparece no trace
- Comando #11, operação 25 TABLE ACCESS CLUSTER COLTYPE$
- Comando #17, operação 15 TABLE ACCESS CLUSTER COLTYPE$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 38 · I_OBJ3
índiceOnde aparece no trace
- Comando #11, operação 27 INDEX RANGE SCAN I_OBJ3
- Comando #17, operação 17 INDEX RANGE SCAN I_OBJ3
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 47 · I_USER2
índiceOnde aparece no trace
- Comando #11, operação 29 INDEX RANGE SCAN I_USER2
- Comando #11, operação 30 INDEX RANGE SCAN I_USER2
- Comando #11, operação 38 INDEX SKIP SCAN I_USER2
- Comando #17, operação 19 INDEX RANGE SCAN I_USER2
- Comando #17, operação 20 INDEX RANGE SCAN I_USER2
- Comando #17, operação 28 INDEX SKIP SCAN I_USER2
- Comando #32, operação 11 INDEX RANGE SCAN I_USER2
- Comando #32, operação 13 INDEX SKIP SCAN I_USER2
- Comando #64, operação 10 INDEX RANGE SCAN I_USER2
- Comando #64, operação 16 INDEX SKIP SCAN I_USER2
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 4 · TAB$
tabelaOnde aparece no trace
- Comando #11, operação 31 TABLE ACCESS CLUSTER TAB$
- Comando #17, operação 21 TABLE ACCESS CLUSTER TAB$
- Comando #26, operação 2 TABLE ACCESS CLUSTER TAB$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 62 · I_OBJAUTH1
índiceOnde aparece no trace
- Comando #11, operação 34 INDEX RANGE SCAN I_OBJAUTH1
- Comando #17, operação 24 INDEX RANGE SCAN I_OBJAUTH1
- Comando #42, operação 3 INDEX RANGE SCAN I_OBJAUTH1
- Comando #47, operação 3 INDEX RANGE SCAN I_OBJAUTH1
- Comando #64, operação 12 INDEX RANGE SCAN I_OBJAUTH1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 432 · IND_STATS$
tabelaOnde aparece no trace
- Comando #13, operação 6 TABLE ACCESS BY INDEX ROWID IND_STATS$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 433 · IDX_0005
índiceOnde aparece no trace
- Comando #13, operação 7 INDEX UNIQUE SCAN IDX_0005
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 104 · DEPENDENCY$
tabelaOnde aparece no trace
- Comando #14, operação 6 TABLE ACCESS BY INDEX ROWID DEPENDENCY$
- Comando #14, operação 13 TABLE ACCESS BY INDEX ROWID DEPENDENCY$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 463 · MON_MODS_ALL$
tabelaOnde aparece no trace
- Comando #23, operação 1 TABLE ACCESS BY INDEX ROWID MON_MODS_ALL$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 14 · SEG$
tabelaOnde aparece no trace
- Comando #28, operação 2 TABLE ACCESS CLUSTER SEG$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 37 · I_OBJ2
índiceOnde aparece no trace
- Comando #29, operação 2 INDEX RANGE SCAN I_OBJ2
- Comando #48, operação 2 INDEX RANGE SCAN I_OBJ2
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 375 · RLS$
tabelaOnde aparece no trace
- Comando #32, operação 9 TABLE ACCESS BY INDEX ROWID RLS$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 377 · IDX_0006
índiceOnde aparece no trace
- Comando #32, operação 10 INDEX RANGE SCAN IDX_0006
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 32 · CCOL$
tabelaOnde aparece no trace
- Comando #34, operação 1 TABLE ACCESS BY INDEX ROWID CCOL$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 160 · TRIGGER$
tabelaOnde aparece no trace
- Comando #37, operação 8 TABLE ACCESS BY INDEX ROWID TRIGGER$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 162 · I_TRIGGER1
índiceOnde aparece no trace
- Comando #37, operação 9 INDEX RANGE SCAN I_TRIGGER1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 11 · I_USER#
índiceOnde aparece no trace
- Comando #37, operação 13 INDEX UNIQUE SCAN I_USER#
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 61 · OBJAUTH$
tabelaOnde aparece no trace
- Comando #42, operação 2 TABLE ACCESS BY INDEX ROWID OBJAUTH$
- Comando #47, operação 2 TABLE ACCESS BY INDEX ROWID OBJAUTH$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 627 · MLOG$
tabelaOnde aparece no trace
- Comando #45, operação 3 TABLE ACCESS CLUSTER MLOG$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 626 · I_MLOG#
índiceOnde aparece no trace
- Comando #45, operação 4 INDEX UNIQUE SCAN I_MLOG#
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 55 · I_CDEF3
índiceOnde aparece no trace
- Comando #46, operação 2 INDEX RANGE SCAN I_CDEF3
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 669 · CDC_CHANGE_TABLES$
tabelaOnde aparece no trace
- Comando #49, operação 1 TABLE ACCESS FULL CDC_CHANGE_TABLES$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 461 · MON_MODS$
tabelaOnde aparece no trace
- Comando #51, operação 1 TABLE ACCESS BY INDEX ROWID MON_MODS$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 1271 · SYS_FBA_TRACKEDTABLES
tabelaOnde aparece no trace
- Comando #52, operação 2 TABLE ACCESS BY INDEX ROWID SYS_FBA_TRACKEDTABLES
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 1272 · SYS_C001489
índiceOnde aparece no trace
- Comando #52, operação 3 INDEX UNIQUE SCAN SYS_C001489
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 68054 · TAB_0006
tabelaOnde aparece no trace
- Comando #53, operação 2 TABLE ACCESS BY INDEX ROWID TAB_0006
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 68057 · IDX_0010
índiceOnde aparece no trace
- Comando #53, operação 3 INDEX RANGE SCAN IDX_0010
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 68536 · IDX_0011
índiceOnde aparece no trace
- Comando #58, operação 2 INDEX RANGE SCAN IDX_0011
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 20 · ICOL$
tabelaOnde aparece no trace
- Comando #59, operação 1 TABLE ACCESS BY INDEX ROWID ICOL$
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 42 · I_ICOL1
índiceOnde aparece no trace
- Comando #59, operação 2 INDEX RANGE SCAN I_ICOL1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 72 · I_SUPEROBJ1
índiceOnde aparece no trace
- Comando #61, operação 2 INDEX UNIQUE SCAN I_SUPEROBJ1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 431 · IDX_0009
índiceOnde aparece no trace
- Comando #62, operação 2 INDEX UNIQUE SCAN IDX_0009
As consultas prontas para rodar no banco ficam na página do objeto, na console.
Objeto 75 · I_VIEW1
índiceOnde aparece no trace
- Comando #64, operação 9 INDEX UNIQUE SCAN I_VIEW1
As consultas prontas para rodar no banco ficam na página do objeto, na console.
WaitScope 1.7.0 · análise feita no servidor · relatório exportado em 29/10/2026 10:19:55