Est-il possible d'afficher les autres processus en cours sur une base de données Oracle ? Quelque chose comme Sybases sp_who
Réponses
Trop de publicités?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.
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;
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
/