He estado tratando de descubrir qué hay de malo en un conjunto de consultas que tengo y estoy confundido en este momento.Las consultas de MySQL son rápidas cuando se ejecutan directamente pero realmente son lentas cuando se ejecutan como proc almacenado
Se supone que está en un procedimiento almacenado al que llama una aplicación GUI.
Sólo hay un "pequeño" problema, la primera vez que un simple UPDATE
, a continuación, un INSERT
utilizando un SELECT
con una subselección y finalmente otra UPDATE
. Al ejecutar estas consultas a mano, obtengo un tiempo total de ejecución de 0.057 s, no muy mal.
Ahora, intento crear un procedimiento almacenado con estas consultas y cinco variables de entrada, ejecuto este procedimiento y en el primer intento me llevó 47.096s con las siguientes llamadas mostrando tiempos de ejecución similares (35 a 50s). Ejecutar consultas individuales desde MySQL Workbench aún muestra tiempos de ejecución de menos de 0.1s
Realmente no hay nada sofisticado en estas consultas, entonces ¿por qué el procedimiento almacenado tarda una eternidad en ejecutarse mientras las consultas solo toman una fracción de segundo? ¿Hay algún tipo de peculiaridad de MySQL que me falta aquí?
Otros resultados de la prueba:
Parece que si corro las consultas en MySQL Workbench pero el uso de variables en lugar de limitarse a poner los valores de las variables en las consultas que se ejecuta tan lento como el procedimiento almacenado. Así que traté de cambiar el procedimiento almacenado para usar solo valores estáticos en lugar de variables y de repente funcionó increíblemente rápido. Aparentemente, por algún motivo, el uso de una variable lo hace extremadamente lento (por ejemplo, la primera consulta UPDATE
va de tomar aproximadamente 0.98s con tres variables a 0.04-0.05s cuando utilizo los valores de las variables directamente en la consulta, independientemente de si es en el procedimiento almacenado o ejecutando la consulta directamente).
Entonces, el problema no es el procedimiento almacenado, es algo relacionado con mi uso de variables (que es inevitable).
Necesitaríamos ver algunos códigos. La primera suposición descabellada sería algo extraño que estás haciendo al declarar/manejar las variables ... pero eso es una suposición completamente * salvaje * sin ver un código. –
Como dije, las consultas muy simples que se ejecutan muy rápido por sí solas, simplemente 'UPDATE table SET column = variable WHERE othercolumn> = othervariable O othercolumn = yetanothervar' type stuff. Y las variables se declaran en el formulario regular 'IN varname COLUMNTYPE (SIZE)' como parámetros para el procedimiento almacenado. Lo que me desconcierta es que no hay nada raro o lento (y sí, evito mostrar el código porque mi jefe probablemente se enoja porque yo lo haya hecho). – mludd
Puedo mencionar que eliminar todas menos la primera consulta 'UPDATE' (que a su vez requiere menos de 0.05s para ejecutarse y luego ejecutar el proceso almacenado todavía da un tiempo de ejecución de alrededor de 1s, y el comentario anterior es una descripción bastante acertada de cómo complejo que 'ACTUALIZAR' es ... – mludd