Estamos tentando descobrir por que uma instrução (bem complicada) tem uma variação extremamente alta em tempo de execução. Às vezes leva apenas "minutos" (cerca de 40-50) e às vezes não termina mesmo depois de 12 horas.
Minha abordagem usual para problemas como esse é verificar se a instrução é monitorada e, se for, obter a execução "em tempo real" dela usando dbms_sqltune.report_sql_monitor()
para que eu possa identificar o gargalo na execução.
No entanto, essa instrução especÃfica nunca é monitorada pela Oracle. De acordo com o manual da Oracle, uma instrução é monitorada, se:
Por padrão, o monitoramento SQL é iniciado automaticamente quando uma instrução SQL é executada em paralelo ou consumiu pelo menos 5 segundos de CPU e tempo de E/S combinados em uma única execução
Como essa instrução é executada por mais de 5 segundos e usa execução paralela, ela deve ser monitorada.
Até adicionamos as dicas gather_plan_statistics
e monitor
ao SQL para forçar o monitoramento da instrução, mas ainda não é monitorado.
De acordo com "My Oracle Support" (DocID: 1613163.1) o monitoramento é limitado a instruções com um plano com menos de 300 linhas. Quando eu gero o plano, ele tem 282 linhas (= ID de linha mais alto do plano), então isso não deve impedir o monitoramento.
Existe um parâmetro oculto ( "_sqlmon_max_planlines"
) que controla isso, mas este é um servidor de banco de dados hospedado e alterar algo assim é bastante complicado.
Então minha pergunta é:
Existem outras restrições (talvez não documentadas) sobre por que a Oracle não monitoraria uma instrução?
Este é um Oracle 11.2.0.3 Enterprise Edition (a atualização para 11.2.0.4 está agendada, mas isso pode levar algum tempo).
A declaração em questão tinha vários planos (13 para ser preciso) que por algum motivo não foram retornados por
dbms_xplan.display_cursor()
. O plano retornado por essa função era um com menos de 300 linhas, mas outros planos tinham mais de 300 linhas.Depois que o parceiro de hospedagem aumentou o
"_sqlmon_max_planlines"
parâmetro para 500, a instrução agora é monitorada.Se você conhece o SQL_ID, também pode emitir:
para garantir que o monitoramento ocorra (por exemplo, mesmo para instruções SQL de execução curta)