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
Comentarios
Publicar un comentario