Est-il possible d'afficher d'autres processus en cours sur une base de données Oracle? Quelque chose comme Sybases sp_who
Je suppose que vous souhaitez simplement récupérer quelques colonnes de V $ SESSION et l’instruction SQL de V $ SQL. En supposant que vous souhaitiez exclure les processus d’arrière-plan exécutés par Oracle
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 externe doit gérer les sessions qui ne sont pas actuellement actives, en supposant que vous les souhaitiez. Vous pouvez également obtenir la colonne sql_fulltext auprès de V $ SQL qui contiendra l’instruction SQL complète plutôt que les 1 000 premiers caractères, mais c’est un CLOB et donc un peu plus compliqué à gérer.
De manière réaliste, vous souhaiterez probablement examiner tout ce qui est disponible dans V $ SESSION car il est probable que vous obtiendrez beaucoup plus d'informations que celles fournies par SP_WHO.
Après avoir examiné sp_who, Oracle n’a pas cette capacité en soi. Oracle a au moins 8 processus en cours d'exécution exécutant la base de données. Comme RMON etc.
Vous pouvez demander à la base de données quelles requêtes sont en cours d'exécution en tant que requêtes 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 SQL qui est actuellement "ACTIVE": -
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é dans l'attente d'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 un bon moyen de rechercher des opérations longues (par exemple, des balayages de table complets). Si c'est à cause de nombreuses opérations courtes, rien ne se présentera.
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
/
N'oubliez pas que la base de données contient des processus qui ne prennent peut-être pas en charge une session.
Si vous êtes intéressé par tous les processus, vous voudrez probablement regarder v $ process (ou gv $ process sur RAC).