Ir al contenido principal

Cómo encontrar la ID de una consulta SQL

Basado en un artículo publicado por Diana Robete

Fecha: 1 de agosto de 2024

¿Has tenido alguna vez que un usuario venga a ti y diga "Mi consulta tarda mucho" o "Mi consulta corría rápido, pero ahora está lento"? Si eres DBA (Administrador de Bases de Datos), probablemente sí.

Muchas veces no tenemos el comando SQL real que el usuario ejecutó, o es complicado obtenerlo desde la aplicación o informe. El usuario puede darte detalles parciales de la consulta "Bueno, busca en la tabla de empleados"...

En casos como estos, necesitas identificar el comando y su ID del comando SQL.

¿Por qué es importante tener el ID del comando SQL?

Como DBA, necesitas saber el ID del comando SQL para analizar problemas de rendimiento. El ID ayuda a identificar el comando en la base de datos, lo que te permite analizar el plan de ejecución, detectar cambios en el plan y consultar los tiempos de ejecución pasados.

¿Qué es el ID del comando SQL?

El ID del comando SQL es único para cada comando. Si dos comandos son idénticos, compartirán el mismo ID. Sin embargo, si un comando tiene una diferencia mínima (como un espacio o un carácter mayúsculo/minúsculo), tendrá un ID diferente.

¿Dónde se almacena el ID del comando SQL?

La vista V$SQL contiene por lo menos una fila para cada ID de comando que aún está en la caché de consultas. La vista puede tener múltiples filas dependiendo de cuántos hijos tiene el comando.

¿Cómo encontrar el ID del comando SQL?

Si tienes suerte y el comando sigue en caché, puedes ejecutar la siguiente consulta para buscarlo:

SELECT /* findsql */ sql_id, child_number, executions, sql_text
FROM v$sql
WHERE command_type IN (2,3,6,7,189)
AND UPPER(sql_text) LIKE UPPER('%part-of-your-sql-text%')
AND UPPER(sql_text) NOT LIKE UPPER('%findsql%');

Si el comando ya no está en caché, puedes utilizar la vista DBA_HIST_SQLTEXT para buscarlo:

SELECT /* histsql */ sql_id, to_char(substr(sql_text,1,4000)) 
FROM dba_hist_sqltext 
WHERE UPPER(sql_text) LIKE UPPER('%part-of-your-sql-text%')
AND   UPPER(sql_text) NOT LIKE UPPER('%histsql%'); 

Ten en cuenta que puedes agregar un HINT con la palabra excluída en el query para excluir las consultas de búsqueda. 

Categorías: Mejores prácticas, Servidor RDBMS, Oracle

#best_practices #oracle #rdbms #query

Comentarios

Entradas populares de este blog

Mejorar el rendimiento de una actualización con Bulk Collect

Hace unos días nos llegó una solicitud para mejorar el rendimiento de una actualización que corre sobre una tabla relativamente grande, de alrededor de 350 Gb, particionada pero esta actualización en específico no está optimizada para hacer uso de la estructura ni los índices existentes. Usualmente iniciamos por hacer una tabla intermedia de manera temporal, sobre la que corre un cursor que va lanzando actualizaciones. Se le rebajó algo de tiempo pero recordé que se puede optimizar este tipo de operaciones utilizando una operación que hace uso de las colecciones conocida como bulk collect. Para utilizar el bulk collect, se necesita primero crear una variable de tipo tabla donde se meterán los datos llave a utilizar para la actualización. Bulk collect tiene una opción llamada limit, que limita la cantidad de registros que se guardan en la colección para no acabarnos la memoria de programa en caso de ser millones de registros. Después de esto, se utiliza una operación...

Cláusula WITH y hint MATERIALIZE

Hace unos días me llegó una consulta con una cláusula 'WITH' que presentaba problemas con la ejecución, tomaba demasiado tiempo. Para los que no están familiarizados, aquí explico cómo funciona la cláusula WITH. Cláusula WITH La cláusula WITH nació en el estándar SQL 99 y es un poco críptico ya que se presenta con una sintaxis reversa de los queries normales, se utiliza para mejorar las consultas anidadas. Utilizando el ejemplo de Oracle con el esquema SCOTT, aquí estan los queries: SELECT e.ename AS employee_name, dc.dept_count AS emp_dept_count FROM emp e JOIN (SELECT deptno, COUNT(*) AS dept_count FROM emp GROUP BY deptno) dc ON e.deptno = dc.deptno; Modificando para utilizar WITH queda así: WITH dept_count AS ( SELECT deptno, COUNT(*) AS dept_count FROM emp GROUP BY deptno) SELECT e.ename AS employee_name, dc.dept_count AS emp_dept_count FROM emp e JOIN dept_count dc ON e.deptno = dc....

Extraer un elemento de XML con EXTRACT desde una tabla en Oracle con Namespace.

Ejemplo con una tabla con campo XML CREATE TABLE mytablechar ( id , xmlcolumn ) AS SELECT 1 , '<report xmlns:nsl="http://xmlns.oracle.com/ns/order"> <nsl:InquireUnifiedCustomerProfileByServiceLocationRequest> <AccountIdentifier> <AddressIdentifier> <AddressId>MyAddress 1020, North Hampton, Va</AddressId> <FullCriteria>1</FullCriteria> </AddressIdentifier> </AccountIdentifier> </nsl:InquireUnifiedCustomerProfileByServiceLocationRequest> </report>' FROM DUAL ; WITH xmlData AS ( SELECT XMLTYPE ( t . xmlcolumn ) xml FROM mytablechar t where t . id = 1 ) SELECT x . xml . EXTRACT ( '/report/ns1:InquireUnifiedCustomerProfileByServiceLocationRequest/AccountIdentifier/AddressIdentifier/addressId' , 'xmlns:ns1="http://xmlns.oracle.com/ns/order"' ). getStringVal () FROM xmlData x ; CREATE TABLE mytableclob ( id numbe...