SQL Server Performance

Cursores, Costos y Performance.

Discussion in 'Preguntas sobre SQL Server en Español.' started by jcaballe, Oct 31, 2003.

  1. jcaballe New Member

    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.

    SELECT@NumeroODT = 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

    SELECT@NumeroODT = ISNULL(MIN(Tmp_NroOdt),'')
    FROM#Tmp_Reclamos (Nolock)
    WHERE Tmp_Asignado > 0

    END

    IF @AsigError <> ''
    Select @AsigError = '6012|' + @AsigError


  2. Luis Martin Moderator

    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
  3. jcaballe New Member

    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

  4. Luis Martin Moderator

    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
  5. Luis Martin Moderator

    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

Share This Page