2008-10-14 290 views

Respuesta

73

sospecho que usted acaba de querer tomar unas columnas de V $ SESSION y la instrucción SQL de V $ SQL. Suponiendo que desea excluir los procesos en segundo plano que la propia Oracle se ejecuta

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 combinación externa es manejar esas sesiones que no están actualmente activos, asumiendo que usted quiere esos. También podría obtener la columna sql_fulltext de V $ SQL, que tendrá la instrucción SQL completa en lugar de los primeros 1000 caracteres, pero eso es un CLOB y es probable que sea un poco más complicado de tratar.

Realísticamente, es probable que desee ver todo lo que está disponible en V $ SESSION porque es probable que pueda obtener mucha más información de la que proporciona SP_WHO.

+9

Si necesita ver rápidamente las consultas que se ejecutan durante mucho tiempo, puede agregar 'sql.elapsed_time/1000000' en el' SELECT', además de la restricción 'DONDE ... Y NO ES sql.elapsed_time null' , y finalmente 'ORDER BY sql.elapsed_time DESC'. –

+1

select * from v $ sql ERROR en la línea 1: ORA-00942: la tabla o vista no existe –

+0

@OleTange Entonces su DBA no le ha otorgado privilegios en esa vista. Tendrás que pedirle a él o ella que lo haga. –

5

Después de mirar sp_who, Oracle no tiene esa capacidad per se. Oracle tiene al menos 8 procesos en ejecución que ejecutan el db. Como RMON, etc.

Puede preguntar al DB qué consultas se están ejecutando como una consulta de tabla. Mira las tablas V $.

Ejemplo rápida:

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

Tenga en cuenta que hay procesos en la base de datos que pueden no admitir una sesión actualmente.

Si está interesado en todos los procesos que querrá mirar a proceso de v $ (o $ proceso gv en el RAC)

3

Ésta muestra SQL que es actualmente "ACTIVO": -

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 
/

Esto muestra bloqueos. A veces las cosas van lentas, pero es porque está bloqueado a la espera de una cerradura:

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 
/

Este es un buen momento para encontrar las operaciones largas (por ejemplo, los recorridos de tablas completas). Si se debe a muchas operaciones cortas, no aparecerá nada.

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 
/
Cuestiones relacionadas