Estamos usando o padrão Oracle 11g, sem nenhuma opção (diag/tunning/perf).
Consigo identificar uma sessão com o SQL abaixo que está tendo um alto consumo (1,4 GB) de memória nas últimas horas... (pga e uga)
Existe alguma maneira de obter detalhes sobre esse consumo?
Se é o uso de tabelas temporárias ou outra coisa?
with x as (select s.osuser osuser , s.username
, s.status
, se.sid
, s.serial# serial
, n.name
, round(max(se.value)/1024/1024, 2) maxmem_mb
, max(se.value) as maxmem
from v$sesstat se , v$statname n , v$session s
where n.statistic# = se.statistic#
and n.name in ('session pga memory','session pga memory max', 'session uga memory','session uga memory max')
and s.sid = se.sid
group by s.osuser, s.username, s.status, se.sid, s.serial#, n.name
order by maxmem desc
)
select * from x where rownum < 5
;
Após algumas pesquisas descobri a view V$PROCESS_MEMORY_DETAIL e como utilizá-la.
Por padrão está sempre vazio e precisa de alguns comandos para "habilitar" (oudebug ou alterar sessão).
Referências que encontrei:
Esta citação do artigo da Oracle diz tudo:
e um SQL útil:
Aqui estão as informações detalhadas ...
Só precisa cavar os nomes misteriosos.
Você pode verificar qual instrução é executada e o que ela faz. O caminho a percorrer é obter SQL_ID de v$session e juntá-lo com v$sqlstats.
Você pode usar DBMS_XPLAN para verificar o plano de execução de sua instrução.
Com esta informação você tem algumas dicas de quais buffers são usados.
Outra possibilidade é instalar o perfstat, tirar um instantâneo, iniciar sua sessão e tirar outro instantâneo quando a sessão terminar. A saída do perfstat fornece uma imagem bastante detalhada da atividade do banco de dados.