Dans cet article, nous allons voir les différentes requêtes pour récupérer l'historique des événements d'attente de la session Oracle.
L'historique des événements d'attente dans une session spécifique depuis le début peut être trouvé à l'aide de la requête ci-dessous
set lines 120 trimspool on
col event head "Waited for" format a30
col total_waits head "Total|Waits" format 999 999
col tw_ms head "Waited|for (ms)" format 999 999.99
col aw_ms head "Average|Wait (ms)" format 999 999,99
col mw_ms head "Max|Wait (ms)" format 999 999,99
select event, total_waits, time_waited10 tw_ms,
attente_moyenne 10 aw_ms, max_wait*10 mw_ms
depuis v$session_event
où sid =&1
/
Supposons que nous voulions voir l'historique des événements d'attente de la session dans une période particulière pour obtenir l'événement d'attente dans cette période uniquement
Ensuite, nous pouvons utiliser la requête ASH ci-dessous pour extraire les données
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') et session_id=1853 et SESSION_SERIAL#=19 regrouper par événement;
NOMBRE D'ÉVÉNEMENTS( )
synchronisation du fichier journal 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-YYYY HH24:MI:SS') and session_id=1853 and SESSION_SERIAL#=19 et event ='log file sync' group by module ;
MODULE COUNT( )
e:FND:cp:FNDICM 88
Supposons que nous voulions connaître l'historique des événements d'attente de la dernière heure, la requête ci-dessous peut être utilisée
colonne sample_time format a30
sélectionnez sample_time, session_state, event, sql_id
dans v$active_session_history
où session_id =&1 et sample_time> SYSDATE – 30/(24*60)
trier par 1 ;
Cas d'utilisation important pour la technique.
Supposons que nous voulions savoir quelle session particulière attendait pendant une certaine période et ce qui la bloquait
Nous pouvons utiliser la requête ci-dessous pour obtenir un événement d'attente et d'autres éléments importants
col event format a30
col sample_time format a25
select session_id, sample_time, session_state, event, wait_time, time_waited, sql_id, sql_child_number CH#
from v$active_session_history
où session_id =19
et sample_time entre
to_date('9-DEC-16 01.25.00 PM','dd-MON-yy hh:mi:ss PM')
et
to_date( '9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM')
commander par sample_time ;
Maintenant, si l'événement est enq :TX - conflit de verrouillage de ligne, nous savons que certaines sessions le bloqueront.
select sample_time, session_state, blocking_session, current_obj#, current_file#, current_block#, current_row#
from v$active_session_history
où sample_time entre
to_date('9-DEC-16 01.25.00 PM' ,'dd-MON-yy hh:mi:ss PM')
et
to_date('9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM ')
et session_id =19
et event ='enq :TX – conflit de verrouillage de ligne'
trier par sample_time ;
Blocking_session affichera l'identifiant de session auquel la session a été bloquée. Nous pouvons également extraire l'instruction sql en utilisant sql_id obtenu ci-dessus pour la session bloquée.
Des requêtes similaires peuvent être utilisées pour identifier les informations de la session de blocage, puis prendre les mesures correctives appropriées
Informations importantes
Vous devez avoir vu que nous avons utilisé l'historique des sessions fréquemment actives et l'archive de l'historique des sessions actives pour ces requêtes
Qu'est-ce que l'historique de session actif ?
L'historique des sessions actives interroge la base de données pour identifier les sessions actives et vide les informations pertinentes sur chacune d'entre elles, telles que l'ID utilisateur, l'état, la machine à partir de laquelle il est connecté et le SQL qu'il exécute, dans une zone spéciale du système global. zone (SGA) de l'instance de base de données appelée tampon ASH
Archive de l'historique des sessions actives
L'historique des sessions actives collecte des informations sur les sessions actives à partir de l'instance de base de données toutes les secondes. Selon l'activité de la base de données, cela entraînera la collecte d'un grand nombre de données dans le tampon ASH, mais comme le tampon ASH est une structure résidente en mémoire, il ne dispose que d'une quantité finie d'espace. De plus, lorsque l'instance tombe en panne, la mémoire de l'instance disparaît avec elle. Par conséquent, Oracle Database archive les informations du tampon ASH dans une table de base de données pour les rendre persistantes. Ces données de table archivées sont visibles dans une vue appelée DBA_HIST_ACTIVE_SESS_HISTORY
Articles connexes
Oracle ASH(Active Session History) Requêtes utiles
Comment trouver quel sid effectue une analyse complète de la table
Comment trouver les détails de la session dans la base de données Oracle
Qu'est-ce que le temps DB et les sessions actives moyennes, session active dans Oracle
comment trouver une session générant beaucoup de redo