Sess waiting

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Voir aussi Sess waiting 8i · Sess users active

Sess waiting produit un rapport des sessions actuellement en attente (wait events), classées par durée d'attente décroissante — les sessions en tête sont celles qui attendent depuis le plus longtemps sur un événement non-idle. Toutes les instances d'un cluster sont couvertes (gv$*).

La liste des événements exclus dans la clause NOT IN correspond aux idle events habituels (attente de message client, timers internes SMON/PMON, messages inter-instances RAC...) qui ne reflètent pas un vrai goulot d'étranglement — cette liste n'est pas figée d'une version à l'autre d'Oracle, à ajuster si un nouvel événement idle apparaît dans les résultats (à vérifier selon version).

Note : le script ne remonte pas les colonnes P1/P2/ P3 de gv$session_wait, alors que ce sont elles qui donnent le détail spécifique à l'événement (numéro de fichier/bloc pour une attente I/O, identifiant de verrou pour une attente de lock...). Pour aller plus loin dans le diagnostic d'un événement précis, ajouter sw.p1, sw.p2, sw.p3 à la liste des colonnes sélectionnées.

Depuis Oracle 10g, v$session expose aussi directement l'événement d'attente courant d'une session (colonnes event, seconds_in_wait...), ce qui permet de se passer de la jointure vers v$session_wait — celle-ci reste disponible pour compatibilité.

Script

SET LINESIZE 180
SET PAGESIZE 50000
SET FEEDBACK 6
SET VERIFY OFF

COLUMN instance_name     FORMAT a9            HEADING 'Instance'
COLUMN sid               FORMAT 999999        HEADING 'SID'
COLUMN serial_id         FORMAT 99999999      HEADING 'Serial ID'
COLUMN oracle_username   FORMAT a20           HEADING 'Utilisateur Oracle'
COLUMN state             FORMAT a8            HEADING 'État'
COLUMN event             FORMAT a25           HEADING 'Événement'
COLUMN wait_time_sec     FORMAT 999,999,999   HEADING 'Attente (sec)'
COLUMN last_sql          FORMAT a45           HEADING 'Dernier SQL'

SELECT
    i.instance_name                 instance_name
  , s.sid                           sid
  , s.serial#                       serial_id
  , s.username                      oracle_username
  , sw.state                        state
  , sw.event                        event
  , sw.seconds_in_wait              wait_time_sec
  , sa.sql_text                     last_sql
FROM
             gv$session_wait sw
  INNER JOIN gv$session s   ON ( sw.inst_id = s.inst_id AND sw.sid = s.sid )
  INNER JOIN gv$sqlarea sa  ON ( s.inst_id = sa.inst_id AND s.sql_address = sa.address )
  INNER JOIN gv$instance i  ON ( s.inst_id = i.inst_id )
WHERE
      sw.event NOT IN (   'rdbms ipc message'
                        , 'smon timer'
                        , 'pmon timer'
                        , 'SQL*Net message from client'
                        , 'lock manager wait for remote message'
                        , 'ges remote message'
                        , 'gcs remote message'
                        , 'gcs for action'
                        , 'client message'
                        , 'pipe get'
                        , 'null event'
                        , 'PX Idle Wait'
                        , 'single-task message'
                        , 'PX Deq: Execution Msg'
                        , 'KXFQ: kxfqdeq - normal deqeue'
                        , 'listen endpoint status'
                        , 'slave wait'
                        , 'wakeup time manager'
                      )
  AND sw.seconds_in_wait > 0
ORDER BY
    wait_time_sec DESC
  , i.instance_name;

Voir aussi