OT: Optimizar procedimiento almacenado SQL Server

449 views
Skip to first unread message

Alci

unread,
Jan 21, 2015, 2:37:01 PM1/21/15
to publice...@googlegroups.com
Hola a todos,

Una consulta a ver si me pueden orientar a como puedo mejorar el rendimiento de un procedimiento almacenado de SQL Server.

El procedimiento utiliza un Cursor (Declare cursor) para seleccionar los registros a procesar, que son aproximadamente 32240 registros (con 32 columnas con valores para el calculo), y se debe recorrer una por una para realizar varios cálculos con los datos y el resultado se inserta en otra tabla.

El tema es que este proceso se repite varias veces, se hace un calculo por cada año desde 1997 al 2014 en este caso... osea por cada año se realiza el proceso de seleccionar los 32mil registro aproximadamente, recorrer una por una y realizar el calculo e insertar el resultado en otra tabla.

El cursor no es lo mas optimo en SQL Server, pero de que manera se podría recorrer los registros seleccionados para realizar los cálculos??

Agradezco cualquier idea o sugerencia que puedan darme.

Los indices están optimizados, ya realizamos un análisis del procedimiento en cuanto al uso de los indices.

Saludos,

Alcides

Ing.Daniel Bojorge

unread,
Jan 21, 2015, 2:48:04 PM1/21/15
to publice...@googlegroups.com
Una pregunta, ¿porqué no mejor recorres esa tabla desde tu programa? (ya sea desarrollado en VFP, Visual Studio o lo que sea).

Dios L@s Bendiga

Saludos,

 
 
Mi Blog
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)

Victor Espina

unread,
Jan 21, 2015, 5:28:25 PM1/21/15
to publice...@googlegroups.com
Efectivamente, los cursores solo deben ser usados en conjuntos muy pequeños de datos, DEFINITIVAMENTE NO CON 32,240 REGISTROS!! :)

Una opcion seria:

1. Crear una tabla temporal (DECLARE @data TABLE (columnas))  con las columnas que necesitas tomar de tu fuente de datos y las columnas para almacenar los calculos a realizar
2. Hacer un INSERT en dicha tabla usando el query que ahora usas como fuente para el cursor, dejando las columnas calculadas en blanco
3. Hacer un UPDATE sobre la tabla temporal para realizar los calculos necesarios, bien sea haciendo uso de CASE o bien invocando una funcion creada por ti

Saludos

Victor Espina

mpulla

unread,
Jan 25, 2015, 9:53:50 AM1/25/15
to publice...@googlegroups.com
Hola Alci.

Dicen que el mejor cursor es el que no se usa..

Sería bueno que expongas la estructura de tus tablas con data de ejemplo, los cálculos que haces, resultado que esperas y versión de Sql.

La manera que expones el problema es muy genérico.

Saludos.
Mauricio

HernanCano

unread,
Jan 25, 2015, 2:34:42 PM1/25/15
to publice...@googlegroups.com
Hola.

Si han de hacerse procesos/cálculos repetitivos, no recomiendo hacerlo sobre la tabla original del motor escogido. Recomandaría:

1. Traer un cursor a VFP con la estructura adecuada
2. Hacer los cambios sobre este cursor.---> muchos procesos repetitivos
3. Mandar el cursor al motor.

Podrías desarrollar en tu escenario pruebas de rendimiento para determinar si el último paso (el 3) se hace por cada año o uno sólo al finalizar todos los años.

Alci

unread,
Jan 26, 2015, 10:05:58 PM1/26/15
to publice...@googlegroups.com
Gracias a todos por sus respuestas...

Definitivamente hay que replantear todo el proceso de calculo, implementando con funciones y realizar las pruebas de rendimiento necesarias.

Saludos,


El miércoles, 21 de enero de 2015, 16:37:01 (UTC-3), Alci escribió:

mpulla

unread,
Jan 27, 2015, 8:28:12 PM1/27/15
to publice...@googlegroups.com
Hola Alci.

Piensa en una solución basa en conjunto de datos así aprovechas lo que tiene Sql Server.
Ojo como invocas a las funciones, trata que estas no se procesen registro por registro.

Saludos.
Mauricio
Reply all
Reply to author
Forward
0 new messages