
Muy buenos días, hoy os hablamos de cómo encontrar una query en Oracle con vistas de sistema.
Lo primero que vamos a hacer es ver cuáles son las situación en las 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:

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:

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:

¿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 :
Tenemos 2 opciones, parchear o cambiar el parámetro:
alter system SET "_push_join_union_view" = FALSE;
Esperamos que os haya sido de utilidad esta entrada.
Apúntate a nuestra newsletter mensual para no perderte ninguna de nuestras entradas. Puedes ver más entradas sobre Oracle aquí: https://www.gpsos.es/tag/oracle/
Nos vemos en próximas entradas.
Fuente: https://www.gpsos.es/2019/09/encontrar-una-query-en-oracle-con-statssqltext/