WAITING, WAIT_TIME et SECONDS_IN_WAIT, par Jonathan Lewis

Cet article est la traduction d’un article de Jonathan Lewis publié sur son blog. L’article original en anglais se trouve ici.

Il précise la signification des colonnes WAIT_TIME et SECONDS_IN_WAIT dans V$SESSION et V$SESSION_WAIT, en fonction de la colonne STATE
Ces vues donnent un moyen rapide pour diagnostiquer une session qui semble bloquée, et savoir si elle est en attente d’un appel système (wait events) ou en CPU.

Un post récent sur le forum OTN fait le commentaire suivant: “le wait event est: latch shared pool, et la CPU est à 100%, il tourne depuis quelques heures et semble bloqué…”

Cela me rappelle une erreur commise fréquemment lorsque les gens regardent la vue V$SESSION_WAIT s’ils oublient de regarder la valeur de la colonne STATE.

Ce que vous devriez vérifier se trouve dans la requête suivante:

select sid, state, event, wait_time, seconds_in_wait from v$session_wait

Lorsque vous interprétez le résultat, souvenez-vous que la session n’est en train d’attendre que si la colonne STATE est exactement à ‘WAITING‘.
Sinon, c’est que la session est en CPU (ou pour être plus précis techniquement, dans la runqueue) et n’est pas en train d’attendre sur un wait event.

Si STATE montre autre chose que ‘WAITING‘, alors la différence entre SECONDS_IN_WAIT et WAIT_TIME donne approximativement (à 3 secondes près puisque la valeur est mise à jour à peu près toutes les 3 secondes) le temps deuis lequel la session est en CPU, ou plus précisément dans la runqueue, depuis la fin du dernier wait event.

A noter: cela vous montre que cette colonne SECONDS_IN_WAIT est très mal nommée, et devrait plutôt être appelée
‘nombre_de_secondes_depuis_le_debut_du_dernier_wait_avec_une_erreur_jusqua_trois_secondes’, mais il y a une limite de 32 caractères pour les noms de colonnes.

A noter aussi que depuis la 10g, on peut aussi faire cette requête sur V$SESSION au lieu de V$SESSION_WAIT

La documentation Oracle précise:

WAIT_TIME:

  • Une valeur différente de 0 donne la durée du dernier wait de la session.
  • Une valeur à zéro veut dire que la session est en train d’attendre sur un wait event.

SECONDS_IN_WAIT:

  • Si WAIT_TIME = 0, alors SECONDS_IN_WAIT est le nombre de secondes passé dans le wait event en cours.
  • Si WAIT_TIME > 0, alors SECONDS_IN_WAIT est le nombre de secondes depuis le début du dernier wait,
    et ( SECONDS_IN_WAIT - WAIT_TIME / 100 ) donne le nombre de secondes où la session est active depuis la fin du dernier wait.

STATE:

  •  0 - WAITING (la session en en train d’attendre sur un wait event)
  • -2 - WAITED UNKNOWN TIME (la durée du dernier wait est inconnue)
  • -1 - WAITED SHORT TIME (la durée du dernier wait est inférieure à un centième de secondes)
  • >0 - WAITED KNOWN TIME (WAIT_TIME donne la durée du dernier wait en centième de secondes)

Laisser un commentaire