Cursores, Costos y Performance. | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

Cursores, Costos y Performance.

Buenas… Yo nuevamente con otra consulta. Estoy revisando la performance de ciertos Procedimientos Almacenados que utiliza mi aplicación, por ello estuve probando algunas recomendaciones del sitio. Por esta razón hice algunos cambios en el mismo y realizé algunas pruebas. La consulta puntual es la siguiente.
He cambiado varios cursores en proc. almacenados por bucles realizados con variables accediendo a los registros por su PK. En las pruebas realizadas el nuevo código tiene un mayor costo para su ejecución (no mas del 10% mas) y demora un 6% mas que con el cursor. Mi consulta es.
Al no utilizar el cursor
– No debería bajar el costo?
– Libera recursos que no son evaluados en el Query Plan?
– Ejecutando de esta forma no se realizan tantos accesos a la base como registros haya en la Tabla siendo que con el cursor se hace uno solo?
Info (en promedio esta tabla tendrá 20 registros con un máximos de 150) Les dejo una porción del cambio para que vean que es lo que cambié.
Saludos y Gracias.
CODIGO VIEJO. DECLARE CurAsignados CURSOR FOR
SELECT Tmp_NroOdt
FROM #Tmp_Reclamos
Where Tmp_Asignado > 0 OPEN CurAsignados FETCH NEXT FROM CurAsignados INTO @NumeroODT
WHILE (@@fetch_status <> -1 )
Begin
Select @AsigError = @AsigError + ‘//’ + Rtrim(@NumeroODT)
FETCH NEXT FROM CurAsignados INTO @NumeroODT
End
Delete From #Tmp_Reclamos Where Tmp_Asignado > 0 Select @AsigError = ‘6012|’ + @AsigError
Deallocate CurAsignados CODIGO NUEVO. SET @AsigError = ”
— Se reemplaza el Cursor. [email protected] = ISNULL(MIN(Tmp_NroOdt),”) — Segundo Control de Posible Asignacion a Usuario
FROM#Tmp_Reclamos (Nolock)
WHERE Tmp_Asignado > 0 WHILE @NumeroODT <> ”
BEGIN
Select @AsigError = @AsigError + ‘//’ + Rtrim(@NumeroODT) DELETE FROM #Tmp_Reclamos
WHERE Tmp_Asignado > 0
AND TMP_NroODT = @NumeroODT [email protected] = ISNULL(MIN(Tmp_NroOdt),”)
FROM#Tmp_Reclamos (Nolock)
WHERE Tmp_Asignado > 0 END IF @AsigError <> ”
Select @AsigError = ‘6012|’ + @AsigError

Tus consideraciones y evaluaciones son correctas.
Ahora, al haber cambiado parte del código y la forma de acceder, tendrías que en principio actualizar las estadísticas en forma completa y, si la base tiene habilitado la opción de creación y actualización automática de estadísticas, usarlo el sistema con las modificaciones durante un tiempo para que SQL registre el nuevo plan, genere estadísticas y las use en forma eficiente.
Luis Martin …Thus mathematics may be defined as the subject in which we never know what we are talking about, nor whether what we are saying is true.
Bertrand Russell
Entonces no se que hacer. (Las recomendaciones de Microsoft son simempre.. SI FUNCIONA DEJALO, o al menos es es lo que nos dijo en algún momento Daniel Seara.) El tema de las estadísticas no va por que es una tabla temporal (se crea en el procedimiento almacenado) El tema del costo, lo estuve probando y siempre es mayor el costo con la nueva forma de ejecución.
Tengo mas accesos a la base de datos. (perdida de performance significa eso para mi)
El Query Plan es mas caro, por lo que no me conviene. El único punto a favor es que Libera Recursos (que no aparecen en el query plan) lo que no se es cuantos recursos son los que libera. Se puede saber esto de alguna forma? Gracias nuevamente
Cuantos recursos libera, no creo que haya forma de saberlo.
Pero dejame consultar en el Forum con respecto al código.
Luis Martin …Thus mathematics may be defined as the subject in which we never know what we are talking about, nor whether what we are saying is true.
Bertrand Russell
Dado el tema sobre los distintos servidores, es mejor esperar lo sugerido en el otro post antes de seguir con este.
Luis Martin …Thus mathematics may be defined as the subject in which we never know what we are talking about, nor whether what we are saying is true.
Bertrand Russell
]]>