|
Hola,
Tal y como te comentaba, dentro de la SQL AREA (de la SHARED POOL) se guardan todas las sentencias ejecutadas.
El motivo es bien sencillo : La reutilización, para otros usuarios que ejecuten la misma sentencia- y así evitar tiempos de 'parsing' -análisis- del camino para encontrar la información tratada y posibilidad de datos en la 'BUFFER CACHE'.
Pero, para que esto sea óptimo, el motor de Oracle utiliza un algoritmo para identificar aquellas sentencias que no se están utilizando (o sea, ocasionales). De esta forma, al llegarle una nueva petición el LRU lo que hace es ver si tiene espacio como para guardar la nueva sentencia. Si no lo tiene, lo que hace és encontrar la de fecha / hora más antigua, y pasa a substituirla. Para ello se basa en la columna : LAST_ACTIVE_TIME de la vista interna V$SQLAREA.
Una vez encontrada la de fecha/hora más antigua es la que pasa a substituir, eliminando la otra de este área compartida. (Existen otros elementos internos, pero no vale la pena explicar, de momento esta es la idea principal).
Por tanto, si lo que quieres -de entre todas las últimas sentencias ejecutadas es sacar la información de la más reciente -con una série de datos que incluyes y necesitas, puedes hacerlo de la siguente forma- (auque esta sentencia se puede ajustar para que en lugar de tenerla en una 'sub-select' coger y calcular la última fecha/hora o valor máximo de esta y compararla).
NOTA : Cuando indicas "... la última sentencia que se cargó ..." haces referencia a la última ejecutada o a la última que entro por encontrar espacio o por substituir a una antigua.
Si es la última que se cargo tendrás que utilizar la columna de ordenación FIRST_LOAD_TIME, sino la que te he indicado anteriormente. Ya que en la anterior, tienes que si alguien ejecuta una sentencia existente, la REUTILIZA, incrementa el NÚMERO DE EJECUCIONES y ACTUALIZA LA FECCHA de 'LAST_ACTIVE_TIME'.
Espero que lo entiendas ...
- Si quieres ordenadas por la última ejecutada :
Select * from
( Select LAST_ACTIVE_TIME ULTIMA_EJECUCION,
SQL_FULLTEXT SENTENCIA,
EXECUTIONS VECES_EJECUTADA,
USERS_EXECUTING VECES_DIFERENTES_USUARIOS
From V$sqlarea a
Order by a.LAST_ACTIVE_TIME desc)
Where rownum <= (numero de sentencias que quieres que te salgan);
- Si quieres ordenadas por la última CARGADA :
Select * from
( Select FIRTS_LAST_TIME ULTIMA_CARGADA,
SQL_FULLTEXT SENTENCIA,
EXECUTIONS VECES_EJECUTADA,
USERS_EXECUTING VECES_DIFERENTES_USUARIOS
From V$sqlarea a
Order by FIRTS_LAST_TIME desc)
Where rownum <= (numero de sentencias que quieres que te salgan;
Has de tener en cuenta los dos conceptos muy claramente!!!
Tambien que en USERS_EXECUTING, si sólo la ejecuta un usuario, su valor será de 0 (luego sumale uno si te interesa) y que se incrementará si otros usuarios diferentes la ejecutan al encontrarla en la SQL AREA (SHARED - POOL).
Si realmente deseas saber o hacer restricción por usuarios de aplicacions y no sacar las sentencias que Oracle Ejecuta Internacmente coloca dentro la restricción de :
PARSING_SCHEMA_NAME in (lista de usuarios de aplicacion) o != 'SYS' y 'SYSMAN' ...., etc.
(Ya que estas sentencias son las que realiza el motor de BB.DD. Internamente y en principio, a no ser que conozcas mucho esta estructura no las analices). Piensa que la restricción es del usuario que solicita el 'analisis o -parsing'- de la sentencia).
Espero que te haya sido de ayuda, y entender como ORACLE mediante esta 'CACHE' -por llamarla de alguna forma, da mejorees tiempos de respuesta, al reutilizar. Y como actua el algoritmo de eliminación y reposición de sentencias ejecutadas.
Advertirte que has tenido suerte por trabajar con una 10g, ya que han creado una columna en esta misma Vista donde contiene toda la sentencia SQL sin necesidad de tener que hacer 'join0' con la 'V$SQLTEXT' a traves del HASH por tener sentencias de longitud mayor a 2000 caracteres.
Un Saludo.
Si tienes alguna duda más, indicamelo. O a ver si sale lo que necesitabas.
Ramón
NOTA : Si eres de alguna empresa de BCN. Busco trabajo.
|