miércoles, 29 de abril de 2009

Control de sesiones activas y de querys que tardan mucho

Si tenemos permisos sobre las tablas adecuadas, podremos ejecutar esta query para ver las sesiones activas en la Base de Datos

Con esta query podemos ver los usuarios conectados, la sentencia SQL que están ejecutando, la hora en que han hecho login, el programa usado,...

SELECT
SQL_TEXT, --Sentencia SQL
USERNAME, --Nombre usuario
SCHEMANAME, --Nombre Eschema
OSUSER, --Usuario del SO
LOGON_TIME, --Hora de Login de esta sesión
STATUS, --INACTIVE o ACTIVE
MACHINE, --La maquina en la que se abre la sesión
PROGRAM --Programa usado, SQLTools.exe, TOAD.exe
FROM
SYS.V_$SESSION S, SYS.V_$SQLAREA A WHERE A.HASH_VALUE=S.SQL_HASH_VALUE
ORDER BY LOGON_TIME DESC;


Y con la siguiente query podemos ver la previsión del tiempo restante para las sentencias
que llevan cierto tiempo en ejecución:

Veremos el usuario, la sentencia, el % que lleva completado, el tiempo que lleva y la hora prevista de fin.

SELECT S.OSUSER, --Usuario de SO
S.USERNAME, --Usuario
A.SQL_TEXT, --Query

SL.OPNAME, --Operación que esta realizando (Table Scan, Sort/Merge,..)
trunc((SL.SOFAR*100)/SL.TOTALWORK,2) AS EVOL, --Evolución en %
SL.SOFAR, --Tiempo que lleva
SL.TOTALWORK, --Tiempo total

To_Char(SYSDATE, 'dd/mm/yyyy HH24:MI:SS') AS T_NOW, --Ahora. Día y hora actual.
To_Char(SYSDATE+((((1/24)/60)/60)*SL.TIME_REMAINING), 'dd/mm/yyyy HH24:MI:SS') AS T_STOP --Día y hora cuando acabará.
FROM
V$SESSION_LONGOPS SL, V$SESSION S ,V$SQLAREA A

WHERE
SL.SOFAR <> SL.TOTALWORK AND
SL.SID = S.SID AND
A.HASH_VALUE=S.SQL_HASH_VALUE;


Hay que tener en cuenta que según de que sentencia se trate, puede tener varias operaciones, con lo cual veremos que va del 0 al 100% varias veces. Es decir, no podemos asegurar de immediato lo que va a tardar, pero si que nos puede dar una idea aproximada.
Muchas veces nos basta con saber si se trata de una prevision de segundos, minutos, horas...

1 comentario: