Mostrar la última sentencia cargada en la SHARED-POOL

Tengo una duda ya que quiero mostrar la última sentencia cargada en la shared-pool con la fecha y hora en la que se cargó, texto de la sentencia, cuantas veces se ha ejecutado y cuantos usuarios la han ejecutado.
He hecho esto:
SELECT last_load_time, sql_text, executions, users_executing
FROM V$SQLAREA;
El caso es que me salen tropecientasmil filas y creo que es porque tengo que especificar por algún lado que lo que busco es en la shared-pool
¿Qué hago?

1 respuesta

Respuesta
1
Es normal como tu dices que te salgan : "Tropecientas mil filas".
Piensa que en la SHARED_POOL se guardan las últimas sentencias realizadas por si hay otro usuario que la va ha ejecutar aproveche el plan de acceso y otras características.
Esto se va eliminando o substituyendo por otras sentencias en función de un algoritmo de LRU (la menos utilizada va fuera y es sustituida por una nueva).
Como no me indicas en que versión estas ejecutando esta consulta (han cambiado campos de la VIEW interna desde la 9i a la 10g en adelante) no t epuedo indicar la columna que indica la última ejecución. Que es por la que tendrías que extraer u ordenar la salida de esa consulta a la vista.
Haz un DESC V$SQLAREA y podrás ver las columnas que la componen. En una de ellas veras la fecha y hora de última ejecución (ten cuidado, porque puede no ser tipo TIMESTAMP, sino VARCHAR2)!. Si supiese la versión con la que trabajas te lo diría.
Otra cosa, si trabajas con versiones 9i o inferior, piensa que la sentencia que se guarda en la columna sql_text tiene un límite de 2000 caracteres. Si tu consulta es mayor, entonces se trucará.
Para verla entera (repito 9i o inferior) tendrías que hacer una 'join' con la vista 'V$SQLTEXT' y unir ambas vistas por la columna 'HASH_VALUE'. Una vez echo esto, piensa que en esta nueva vista tienes la sentencia tal y como se escribió y por lineas.
Es decir tendrás que ordenar la salida por PIECE y sacar SQL_TEXT. Ya que completa en varios registros la sentencia.
Hola, la version que uso es Oracle 10g.
Cuando hago desc de V$sqlarea no me sale algo como lo que dices (o eso creo). He intentado copiarte aquí todo lo que sale pero no me deja porque dice que hay demasiadas mayúsculas.
La única que veo con sentido es last_load_time que ya la puse en la consulta (que es esta):
SELECT last_load_time, sql_text, executions, users_executing
FROM V$SQLAREA;
A ver si me sacas de la duda ^^
Saludos
Tal y como te comentaba, dentro de la SQL ÁREA (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 es 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 serie de datos que incluyes y necesitas, puedes hacerlo de la siguiente forma- (aunque 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!
También que en USERS_EXECUTING, si sólo la ejecuta un usuario, su valor será de 0 (luego súmale uno si te interesa) y que se incrementará si otros usuarios diferentes la ejecutan al encontrarla en la SQL ÁREA (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 'análisis 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 actúa 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 través del HASH por tener sentencias de longitud mayor a 2000 caracteres.
Un Saludo.
Si tienes alguna duda más, indícamelo. O a ver si sale lo que necesitabas.
Ramón
NOTA : Si eres de alguna empresa de BCN. Busco trabajo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas