Neste post, veremos as diferentes consultas para recuperar o histórico waitevent da sessão Oracle.
O histórico de eventos de espera em uma sessão específica desde o início pode ser encontrado usando a consulta abaixo
definir linhas 120 trimspool no
col event head Formato “Aguardado” a30
col total_waits head Formato “Total|Aguarda” 999.999
col tw_ms head Formato “Aguardado|por (ms)” 999.999,99
col aw_ms head Formato “Average|Wait (ms)” 999.999,99
col mw_ms head Formato “Max|Wait (ms)” 999.999,99
selecionar evento, total_waits, time_waited10 tw_ms,
espera_média 10 aw_ms, max_wait*10 mw_ms
de v$session_event
onde sid =&1
/
Suponha que queremos ver o histórico de eventos de espera da sessão em determinado período para obter o evento de espera somente nesse período
Então podemos usar a consulta ASH abaixo para extrair os dados
SQL> SELECT event,count()
FROM dba_hist_active_sess_history a
WHERE a.sample_time BETWEEN to_date('12-OCT-2016 11:49:00′,'DD-MON-YYYY HH24:MI:SS') AND
to_date('12-OCT-2016 15:04:00′,'DD-MON-YYYY HH24:MI:SS') e session_id=1853 e SESSION_SERIAL#=19 agrupar por evento;
CONTAGEM DE EVENTOS( )
sincronização de arquivo de log 88
SQL> SELECT module,count()
2 FROM dba_hist_active_sess_history a
3 WHERE a.sample_time BETWEEN to_date('12-OCT-2016 11:49:00′,'DD-MON-YYYY HH24:MI:SS') AND
4 to_date('12-OCT-2016 15:04:00′,'DD-MON-AAAA HH24:MI:SS') e session_id=1853 e SESSION_SERIAL#=19 e event ='log file sync' agrupar por módulo;
MODULE COUNT( )
e:FND:cp:FNDICM 88
Suponha que queremos saber o histórico do evento de espera da última hora, então a consulta abaixo pode ser usada
coluna sample_time formato a30
selecione sample_time, session_state, event, sql_id
de v$active_session_history
onde session_id =&1 e sample_time> SYSDATE – 30/(24*60)
ordenar por 1;
Caso de uso importante para a técnica.
Suponha que queremos saber o que uma sessão específica estava esperando durante um determinado período e o que a estava bloqueando
Podemos usar a consulta abaixo para obter o evento de espera e outras coisas importantes
col event format a30
col sample_time format a25
selecione session_id, sample_time, session_state, event, wait_time, time_waited, sql_id, sql_child_number CH#
de v$active_session_history
onde session_id =19
e sample_time entre
to_date('9-DEC-16 01.25.00 PM','dd-MON-yy hh:mi:ss PM')
e
to_date( '9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM')
pedir por sample_time;
Agora, se o evento for enq:TX – contenção de bloqueio de linha, sabemos que determinada sessão o bloqueará.
selecione sample_time, session_state, blocking_session, current_obj#, current_file#, current_block#, current_row#
de v$active_session_history
onde sample_time entre
to_date('9-DEC-16 01.25.00 PM' ,'dd-MON-aa hh:mi:ss PM')
e
to_date('9-DEC-16 02.25.00 PM','dd-MON-aa hh:mi:ss PM ')
e session_id =19
e event ='enq:TX – contenção de bloqueio de linha'
ordenar por sample_time;
Blocking_session mostrará o ID da sessão em que a sessão foi bloqueada. Podemos extrair a instrução sql também usando sql_id obtido acima para a sessão bloqueada.
Consultas semelhantes podem ser usadas para identificar as informações da sessão de bloqueio e tomar as ações corretivas adequadas
Informações importantes
Você deve ter visto que usamos frequentemente o histórico de sessões ativas e o arquivo de histórico de sessões ativo para essas consultas
O que é Histórico de sessões ativas
O Active Session History pesquisa o banco de dados para identificar as sessões ativas e despeja informações relevantes sobre cada uma delas - como o ID do usuário, o estado, a máquina da qual está conectado e o SQL que está executando - em uma área especial no sistema global área (SGA) da instância do banco de dados chamada de buffer ASH
Arquivo de histórico de sessão ativo
O Active Session History coleta informações sobre sessões ativas da instância do banco de dados a cada segundo. Dependendo da atividade do banco de dados, isso levará a muitos dados coletados dentro do buffer ASH, mas como o buffer ASH é uma estrutura residente na memória, ele tem apenas uma quantidade finita de espaço. Além disso, quando a instância fica inativa, a memória da instância desaparece com ela. Portanto, o Oracle Database arquiva as informações do buffer ASH em uma tabela de banco de dados para torná-las persistentes. Esses dados de tabela arquivados são visíveis em uma visualização chamada DBA_HIST_ACTIVE_SESS_HISTORY
Artigos relacionados
Consultas úteis do Oracle ASH (Active Session History)
Como descobrir qual lado está fazendo a varredura completa da tabela
Como encontrar detalhes da sessão no banco de dados Oracle
O que é tempo de banco de dados e sessões ativas médias, sessão ativa no oracle
como encontrar sessão gerando muitos refazer