Atualmente, estou ajudando algumas organizações com o desempenho do banco de dados Oracle. Eles estão usando o Oracle 11gR2 Standard Edition no Windows 2008. Como não há pacotes de desempenho corporativo disponíveis nesta edição padrão, tive que usar o v$sql para consultar os mais antigos para identificar gargalos de desempenho. Usando a consulta abaixo:
SELECT *
FROM (
SELECT sql_text,
sql_id,
elapsed_time,
plsql_exec_time,
cpu_time,
executions,
fetches,
loads,
buffer_gets,
elapsed_time / executions
FROM v$sql -- order by elapsed_time / executions) ) where rownum <= 10;
Ele retornou algumas consultas que examinarei, mas há duas linhas nos resultados que não consigo entender o motivo pelo qual elas deveriam existir aqui:
Como você pode ver, a consulta é executada em sys.job$
, portanto, deve estar relacionada aos trabalhos oracle definidos neste banco de dados. Minhas perguntas são:
1) O que significam essas duas linhas? Devo consultar dba_jobs
a tabela para obter mais informações? Como devo consultá-los e o que devo procurar?
2) Ambas as consultas parecem idênticas, por que elas são repetidas duas vezes no resultado da consulta?
Se essa for sua consulta mais demorada, seu banco de dados não fará quase nada.
Isso é 0,211599 e 0,002923 segundos por execução com um tempo de execução total de 39,9 e 1,7 segundos.
order by elapsed_time / executions) ) where rownum <= 10;
Isso retorna as consultas de execução mais curta, não as de execução mais longa. Usar
order by ... desc
.Não. Esta é uma instrução interna que atualiza o dicionário com a hora de início de um trabalho ao iniciá-lo. Não há nada para investigar sobre isso.
Você deve encontrar esta informação em V$SQL_SHARED_CURSOR . Procure a coluna com um valor de
Y
e o nome dessa coluna especifica o motivo de ter outro cursor filho.