Para uma consulta que retorna se há alguma transação ativa na sessão atual,
SELECT COUNT(*)
FROM
v$transaction t
INNER JOIN v$session s ON (t.ses_addr = s.saddr )
INNER JOIN v$mystat m ON (s.sid = m.sid )
WHERE ROWNUM = 1;
EXPLAIN
mostra custo 0. No entanto, isso não parece ser verdade. A execução periódica dessa consulta em um ambiente de alta carga faz com que o servidor desperdice quase todos os seus recursos.
Qual é a maneira certa de estimar o impacto de tais consultas (acredito que o mesmo problema ocorre não apenas para esta consulta específica, mas para qualquer coisa que envolva visualizações do sistema)?
Obrigado.
Algumas (todas?) as exibições dinâmicas
V$
não são baseadas em tabelas de dicionário, mas em estruturas de memória, portanto, as estatísticas tradicionais não são coletadas e, portanto, o otimizador não pode calcular o custo das consultas nessas exibições.No entanto, o custo do plano de explicação é apenas uma aproximação aproximada do trabalho esperado, portanto, não deve ser sua única maneira de avaliar a eficiência de uma consulta. O custo real de uma consulta pode ser revelado com um rastreamento. Rastreie sua consulta real e todas as consultas alternativas e o tkprof revelará qual é a mais eficiente.
Para sua consulta em particular, parece que você deseja determinar se sua sessão atual tem trabalho não confirmado. Consultas alternativas são descritas nas seguintes perguntas SO:
Você pode tentar as consultas nessas perguntas e nos dizer qual é a mais eficiente (em seu ambiente de alta carga)?