Skip to content

Cambios de configuraciones en cursores de SQL Server

Cuando se trata de comparar código en diferentes escenarios, podemos incurrir en conclusiones erradas. Por eso es tan importante la validación de una afirmación antes de asumirla como una verdad absoluta. Pasa lo mismo cuando hablamos de configuraciones en cursores de TSQL.

¿Configuraciones en cursores?

Si no has visto las opciones que tienes al usar un cursor en SQL Server, es importante que las conozcas en la documentación oficial sobre cursores.

Estas configuraciones vistas como parámetros en la sintaxis del cursor, determinarán el comportamiento de este objeto y, por ende, su rendimiento.

¿Mejores prácticas/alternativas?

Si se trata de encontrar «lo mejor», yo te diría que lo mejor es no usar cursores. Siempre hay una alternativa basada en procesar conjuntos en lugar de procesar fila a fila.

Es posible que hayas visto en diferentes portales de la web, que las mejores opciones vienen de la mano de la configuración LOCAL FAST_FORWARD. Si bien puede ser cierto es importante que así lo verifiques en tu escenario.

¿Afecta el cambio de configuraciones en cursores?

Voy a hacer un ejemplo sencillo con nuestra tabla FakeTable. Si no la conoces aún, mira cómo generar Millones de Datos Aleatorios en SQL Server.

La consulta será la siguiente.


SELECT Office, Gender, COUNT(*)
FROM dbo.FakeTable
GROUP BY Office, Gender
ORDER BY 3 DESC

Como puedes ver no tiene mayor dificultad. Una agrupación por oficina y género para realizar un conteo.

Lo único que voy a hacer aquí es llevarme cada uno de los registros para ser usados a través de un cursor. Voy a comparar dos configuraciones diferentes.

configuraciones-en-cursores
DECLARE @Of int,
 @Gen int,
 @Total int

--DECLARE mycursor CURSOR LOCAL FAST_FORWARD
--DECLARE mycursor CURSOR LOCAL STATIC
FOR
	SELECT Office, Gender, COUNT(*)
	FROM FakeTable
	GROUP BY Office, Gender
	ORDER BY 3 DESC

OPEN mycursor

FETCH mycursor INTO @Of, @Gen, @Total

¿Cuál debería ser más rápido?

Si partimos de la suposición de que el cursor con la configuración FAST_FORWARD es el más eficiente…

Veamos sus planes de ejecución en ambos casos. Verás que encontramos una particular diferencia entre ellos.

¡Exacto! Paralelismo.

El cursor con la configuración STATIC sí pudo usar paralelismo en su ejecución.

¿Es mejor que una consulta use o que no use paralelismo? Puede ser una pregunta capciosa, mejor mira la publicación Comprender el paralelismo en SQL Server.

Vamos un poco más a los detalles, activando las estadísticas de tiempo con SET STATISTICS TIME ON.

Claramente puede verse una diferencia de aproximadamente un 60%. El primer query tiene una duración de 239 ms y el segundo 88 ms. En este caso, el uso de paralelismo ayudó a una más rápida ejecución.

Entonces, ¿qué configuraciones en cursores debemos utilizar?

Primero que nada comprende la teoría de cada una de las opciones.

No te bases solamente en la búsqueda de la mejor opción. Primero el concepto de dará la opción adecuada para aquello que requieres hacer.

Cada escenario es diferente. Tipos de datos, tamaños, volúmenes de información, etc. Por eso es muy importante que sepas Cómo hacer Testing en SQL Server.

Prueba, valida, compara.

www.datoptim.com
I love working on SQL Server Performance Tuning and finding the origin of the problems. Music and SQL Server passionate.

Carrito
Volver arriba