
El resultado de un Stored Procedure y los tiempos de Delphi.
#1
Escrito 04 enero 2012 - 04:00
Tengo un pequeño detallín con el resultado de un Stored Procedure, el cual tiene un tiempo de procesamiento de más de 15 minutos, un mundo de tiempo que el venerable Delphi 6 que estoy usando para desarrollar la aplicación con un TADOQuery que recoge ése resultado no alcanza a procesar; al grado que inicia el procesamiento de ése SP y la aplicación Delphi "cierra" la conexión, tira el servicio y no muestra el resultado en un reporte, que es la finalidad de ésta aplicación.
¿Alguna idea que me permita ejecutar el Stored Procedure HASTA QUE TERMINE y arroje el resultado deseado al reporte?
#2
Escrito 04 enero 2012 - 05:22
Saludos
#3
Escrito 04 enero 2012 - 06:22
¿Es necesario que dure todo ese tiempo en ejecución?
¿Es posible disminuir el tiempo de procesamiento?
#4
Escrito 05 enero 2012 - 03:06
Un tiempo de ejecución tan alto normalmente suele implicar que hay consultas dentro del procedimiento almacenado que no están bien optimizadas (mediante índices).
Cuando en un procedimiento almacenado hay una subconsulta mal optimizada, a copia de repetirse varios cientos de veces en el bucle principal, puede provocar estos tiempos de varios minutos de ejecución.
En cualquier caso, la versión profesional de IB-Expert (y de otros gestores comerciales de Firebird) lleva un depurador de procedimientos almacenados, con el que ejecutar el procedimiento línea a línea, y ver donde está el problema.
Instala al menos su versión de evaluación, para poder probar esta característica.
Otra buena idea es ejecutar independientemente cada consulta integrada en el procedimiento almacenado, para ver su plan de ejecución y asegurarte de que tiene los índices adecuados para ejecutarse de forma óptima.
Saludos.
#5
Escrito 05 enero 2012 - 03:18
En cualquier caso, mi consejo sería el mismo. Prueba a depurar tu SP con el depurador de procedimientos almacenados que integra SQL Server, y revisa el plan de ejecución de las consultas integradas en dicho procedimiento.
NOTA: Muchas veces también habrá que revisar los triggers de las tablas modificadas por el procedimiento almacenado. Puesto que si un trigger está mal optimizado, normalmente no será apreciable al modificar solo un registro, pero en cambio al intentar modificar muchos registros, el retraso se hará enorme. La solución es la misma que en el procedimiento almacenado, hay que revisar el plan de ejecución de las consultas implicadas en el trigger, para asegurarnos de que estén optimizadas correctamente con un índice adecuado.
Saludos.
#6
Escrito 05 enero 2012 - 07:34
Sí, es un reporte importantísimo.¿Es necesario que dure todo ese tiempo en ejecución?
No, el DBA ya hizo todo lo humana y técnicamente posible y no pudo bajarle NADA al tiempo.¿Es posible disminuir el tiempo de procesamiento?
Y así está definido, pero simplemente mientras hace lo suyo, no permite más procesos....creo el detalle debe ser el timeout de la conexión, que también en los componentes ADO de Delphi debe ser 0 para esperar hasta que la ejecución del SP sea completada y evitar se desconecte...
Independientemente del motor, el DBA ya revisó, modificó, probó, hizo todo lo posible para bajar el tiempo de procesamiento y no se logró hacer nada. El problema lo tengo yo ahora mismo por el punto de que el DBA ya se dió por vencido intentando bajar el tiempo.Hola.
Un tiempo de ejecución tan alto normalmente suele implicar que hay consultas dentro del procedimiento almacenado que no están bien optimizadas (mediante índices).
Cuando en un procedimiento almacenado hay una subconsulta mal optimizada, a copia de repetirse varios cientos de veces en el bucle principal, puede provocar estos tiempos de varios minutos de ejecución.
En cualquier caso, la versión profesional de IB-Expert (y de otros gestores comerciales de Firebird) lleva un depurador de procedimientos almacenados, con el que ejecutar el procedimiento línea a línea, y ver donde está el problema.
Instala al menos su versión de evaluación, para poder probar esta característica.
Otra buena idea es ejecutar independientemente cada consulta integrada en el procedimiento almacenado, para ver su plan de ejecución y asegurarte de que tiene los índices adecuados para ejecutarse de forma óptima.
Saludos.
#7
Escrito 05 enero 2012 - 08:07
Estás utilizando transacciones ?
Porque no generas un hilo exclusivo para ese proceso y/o una aplicación "standalone" que no involucre otros procesos que le demanden atención.
O sea, el pedo ya está en tu cancha y a rajarse a su rancho

Saludos
#8
Escrito 05 enero 2012 - 08:16
Ahora que si la ejecución del mismo SP directamente en el servidor colapsa tu servidor, mmm TAdoQuery y Delphi estan libres de culpa, jajaja.
Saludos
#9
Escrito 05 enero 2012 - 08:37
..... Ahora que si la ejecución del mismo SP directamente en el servidor colapsa tu servidor, mmm TAdoQuery y Delphi estan libres de culpa, jajaja........
Vaya, no había leído/entendido eso. Pues si, poco se puede hacer con delphi si el problema se presenta directamente en la base de datos.
Saludos.
#10
Escrito 05 enero 2012 - 09:44
Sucede en CUALQUIER máquina, y ésta aplicación NO corre en el servidor, precisamente para no generarle más carga al procesador.Eso pasa en una máquina remota o en la misma máquina donde se localiza la base de datos ?
Nope..., el resultado de éste SP es arrojar el resultado en una tabla cursor.Estás utilizando transacciones ?
Está en un hilo exclusivo. ¿Recuerdas alguna vez hice una consulta sobre hilos? Fue precisamente para éste caso en particular.Porque no generas un hilo exclusivo para ese proceso y/o una aplicación "standalone" que no involucre otros procesos que le demanden atención.
Ciertamente, es mi perro y yo lo baño...O sea, el pedo ya está en tu cancha y a rajarse a su rancho

No hemos probado éste enfoque. Le comentaré al DBA sobre éste detalle y les comento.Mmm interesante asunto, me ha pasado mucho en MS SQL Server, que hay veces en si tu SP principal invoca otros SP's surgen bloqueos entre ellos, si es este tu motor o cualquier otro yo me iría a monitorear los tiempos de ejecución de cada SP o query, analizar los tiempos y si es que no existen bloqueos por otras transacciones como sugiere Marc, usa el SQL Server Profiler, es lo que normalmente hago en SP's inmensos en MS SQL Server en cierres que toman hasta horas en procesarse...
#11
Escrito 05 enero 2012 - 01:40
Tal vez no sea lo más optimo y LA respuesta que buscas pero... Si es que el SP tiene como función hacer muchos cálculos, subconsultas, y varios procesos intermedios quizá un enfoque de "divide y vencerás" podría ayudar a alivianar.
Primeramente considera la utilización de tablas "resúmen" que almacenen algunos datos pre-calculados que se utilicen en algunas operaciones de SP. Quizá se haga más grande y compleja la base de datos pero estos tipos de tablas con datos calculados ayudan mucho cuando se tienen muchos registros de varias tablas relacionadas... Cuanto más existan más se tarda el server en hacer los cálculos. Si algunos de estos datos se almacenaran en estas tablas resumenes no hace falta tener que estar explotando los miles de registros y de tablas.
En segundo lugar busca proponer una descomposición de dicho SP. ¡Es tan necesario que haga todo ese trabajo en un SP? ¿Porqué no descomponerlo en pedazos más chicos... y que alimenten informes separados? A veces es mejor tener dos o tres informes fáciles de tirar que tener un mega informe que no llega más... Está bien que se aproveche el poder de una máquina para ayudarnos a tomar decisiones, pero que no se abuse... y que el jefecito aprenda a usar la cabeza y unir al vuelo lo que lee de los informes

Saludos,