60 votes

Comment afficher les processus en cours dans Oracle DB ?

Est-il possible d'afficher les autres processus en cours sur une base de données Oracle ? Quelque chose comme Sybases sp_who

82voto

Justin Cave Points 114578

Je pense que vous voudrez simplement récupérer quelques colonnes de V$SESSION et l'instruction SQL de V$SQL. En supposant que vous voulez exclure les processus d'arrière-plan qu'Oracle lui-même exécute

SELECT sess.process, sess.status, sess.username, sess.schemaname, sql.sql_text
  FROM v$session sess,
       v$sql     sql
 WHERE sql.sql_id(+) = sess.sql_id
   AND sess.type     = 'USER'

La jointure extérieure sert à gérer les sessions qui ne sont pas actuellement actives, en supposant que vous les vouliez. Vous pouvez également obtenir la colonne sql_fulltext de V$SQL qui contiendra la déclaration SQL complète plutôt que les 1000 premiers caractères, mais il s'agit d'une CLOB et il est donc probablement un peu plus compliqué de la gérer.

De manière réaliste, vous voulez probablement regarder tout ce qui est disponible dans V$SESSION car il est probable que vous puissiez obtenir beaucoup plus d'informations que ce que SP_WHO fournit.

5voto

jim Points 1035

Après avoir regardé sp_who, Oracle n'a pas cette capacité en soi. Oracle a au moins 8 processus en cours d'exécution qui font tourner la base de données. Comme RMON, etc.

Vous pouvez demander à la base de données quelles sont les requêtes en cours d'exécution, car il s'agit simplement d'une requête de table. Regardez les tables V$.

Exemple rapide :

SELECT sid,
       opname,
       sofar,
       totalwork,
       units,
       elapsed_seconds,
       time_remaining
FROM v$session_longops
WHERE sofar != totalwork;

4voto

WW. Points 11335

Celui-ci montre le SQL qui est actuellement "ACTIF" :-.

select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value
and s.status = 'ACTIVE'
and s.username <> 'SYSTEM'
order by s.sid,t.piece
/

Cela montre les serrures. Parfois, les choses vont lentement, mais c'est parce qu'il est bloqué en attendant un verrou :

select
  object_name, 
  object_type, 
  session_id, 
  type,         -- Type or system/user lock
  lmode,        -- lock mode in which session holds lock
  request, 
  block, 
  ctime         -- Time since current mode was granted
from
  v$locked_object, all_objects, v$lock
where
  v$locked_object.object_id = all_objects.object_id AND
  v$lock.id1 = all_objects.object_id AND
  v$lock.sid = v$locked_object.session_id
order by
  session_id, ctime desc, object_name
/

C'est une bonne méthode pour trouver les opérations longues (par exemple, les balayages complets de tables). Si c'est à cause de beaucoup d'opérations courtes, rien n'apparaîtra.

COLUMN percent FORMAT 999.99 

SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
message,( sofar/totalwork)* 100 percent 
FROM v$session_longops
WHERE sofar/totalwork < 1
/

1voto

Ryan Points 11

N'oubliez pas que certains processus de la base de données peuvent ne pas prendre en charge une session.

Si vous êtes intéressé par tous les processus, vous voudrez regarder dans v$process (ou gv$process sur RAC)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X