Encontrar una query en Oracle con stats$sqltext

Hola, hoy vamos a enseñar cómo encontrar una query en Oracle con vistas de sistema.

Primero vamos  a ver cuáles son la situación en que debemos analizar estos planes.

Búsqueda del SQL_ID y el SQL_TEXT con el HASH_VALUE

Tenemos el siguiente HASH_VALUE: 2433220526

Necesitamos encontrar tanto su SQL_ID como su SQL_TEXT para ver que sentencia es la que se está ejecutando. Para ello ejecutamos:

select SQL_ID , sql_text from V$sqltext where
hash_value=2433220526 order by piece asc;

Ordenamos por las piezas ascendentemente y obtenemos:

 select SQL_ID , sql_text from V$sqltext where hash_value=2433220526 order by piece asc;
 SQL_ID          SQL_TEXT
 ------------   --------------------------------------------------------
 fcs9x3q8hgzxf SELECT COUNT (*) FROM TEMP_CAB_MOV TCM , PEDIDOS_VEN_COM_LIN PVC
 fcs9x3q8hgzxf WHERE PVC.SERIE_NUMERACION =  TCM.SERIE_PEDIDO  AND PVC.NUMER
 fcs9x3q8hgzxf O_PEDIDO_COM =  TCM.NUMERO_PEDIDO  AND PVC.ORGANIZACION_COMPRAS
 fcs9x3q8hgzxf  =  TCM.ORGANIZACION_COMP  AND PVC.NUMERO_LINEA_COM =  TCM.NUMERO
 fcs9x3q8hgzxf _LINEA  AND PVC.EMPRESA =  TCM.CODIGO_EMPRESA  AND TCM.CODIGO_EM
 fcs9x3q8hgzxf PRESA =  :b1  AND TCM.CODIGO_USUARIO =  :b2  AND TCM.FECHA_INICI
 fcs9x3q8hgzxf  O =  :b3  AND TCM.CONTADOR =  :b4
 7 filas seleccionadas. 

Estimar plan de ejecución

Ya tendríamos nuestra select. Ahora, vamos a estimar su plan de ejecución:

Encontrar query en Oracle

Este sería el escenario ideal, que la query aún permaneciese en las vistas V$SQLAREA y V$SQLTEXT. El problema aparece cuando necesitamos encontrar una query que ya no aparece en estas vistas dinámicas pues su plan de ejecución ya ha cambiado.

Es un problema recurrente al analizar los reportes de statspack, nos muestra los OLD_HASH_VALUE que ya no encontraremos en estas vistas.

¿Qué necesitamos para encontrar una query en Oracle?

Tenemos una vista a la que atacaremos para encontrar dichas querys.

La vista es stats$sqltext.

Tenemos el siguiente STATSPACK:

stats sql text

Vamos a la sección de “SQL ordered by CPU “ para buscar la sentencia que más CPU consume.

En nuestro caso, vemos que la sentencia no está completa y que si la buscamos en las V$ no aparece:

encontrar una query en Oracle

¿Qué hacer ahora? No está todo perdido, aún podemos consultar la vista stats$sqltext

select distinct SQL_ID from 
STATS$SQLTEXT where SQL_ID in (2433220526) ;

Ya hemos encontrado la query!! Ya podemos ver el plan de ejecución y ver como optimizarlo!

Ahora ejecutamos explain plan y posteriormente select * from table(dbms_xplan.display)

Justo esta query, demora su tiempo de ejecución por un bug de Oracle referido en :

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=369334702236336&parent=EXTERNAL_SEARCH&sourceId=PROBLEM&id=2382419.1&_afrWindowMode=0&_adf.ctrl-state=ioe1lcbsm_4

Tenemos 2 opciones, parchear o cambiar el parámetro:

alter system SET "_push_join_union_view" = FALSE;

Si no quieres perderte ninguna de estas entradas, apúntate a nuestra newsletter mensual. Puedes ver más entradas sobre Oracle aquí: https://www.gpsos.es/tag/oracle/

Nos vemos en próximas entradas.