Procedimiento almacenado de SQL Server demora mucho.

lunes, 3 de mayo de 2010
Publicado por Ivan

Nuevamente el titulo es bastante genérico, por lo que paso a detallar el problema.

El problema era el siguiente: Uso powerbuilder para desarrollar, y en esta herramienta hay un objeto que es la piedrangular de powerbuilder, que es la datawindow. Es una datagrid pero con esteroides, buenos métodos y estados. En ella se especifica una consulta sql, y con eso retorna los valores en si misma, que pueden ser modificados, ingresados nuevos valores o eliminados, y luego se llama al método update de la misma, y solita construye los insert, delete o updates necesarios para que todo quede como lo dejamos en la datawindow.

En fin!, generalmente cuando debo hacer informes en ella genero la consulta en el administrador de sql server para asegurarme que me traiga los resultados que necesito, y luego la copio en la datawindow. Esta consulta tenìa un parámetro, por lo que en el administrador usaba una variable para simular el funcionamiento que tendría en la datawindow, y bien!!!, demoraba 6 segundos en traer lo que que necesitaba. Copié en la datawindow, lo probé, y..... rayos!!!, demoraba 11 minutos!!!!.

Pensé que a lo mejor la datawindow podría estar mal, la hice de nuevo, le copie la consulta, y lo mismo. No me explicaba como la misma consulta demoraba tanto ejecutada desde la datawindow, y tan poco desde el administrador de SQL Server. Luego, pensé que llamando los resultados desde un procedimiento almacenado podría apurar un poco las cosas, y mi sorpresa fué mayor cuando luego de crear el procedimiento lo ejecuté en el mimo administrador de sql y rayos!!!, 11 minutos tambien!!!!.

Luego de pegarme un par de cabezasos decidí preguntar a mis colegas para ver si a alguno le habia pasado lo mismo, y llegué al jefe. Ahí me comentó que tampoco sabía porqué, pero que eso se arreglaba tomando el parametro pasado al procedimiento, asignandolo a una variable dentro del procedimiento, y luego usando dicha variable en vez del argumento del procedimiento.

Extrañó!, debería ser lo mismo, pero probé y chan!!!!, pasamos de 11 minutos a 6 segundos. El jefe suponía que seguramente los argumentos de los procedimientos almacenados son almacenados en un área no optimizada o muy concurrida, tal que a lo mejor por eso hay demoras excesivas para acceder al valor de dicho argumento cuando el procedimiento almacenado lo necesita.

En resumen, la solución pasa por tomar las variables del argumento del procedimiento, y ponerlas en variables locales al procedimiento, y luego ejecutar el procedimiento almacenado. Con esto, asunto arreglado!!!!!


2 comentarios:

Anónimo dijo...

negro!

me salvaste la vida!!!

muy groso!!!

Anónimo dijo...

oooo a mi tambien!