none
Mejorar el rendimiento de una consulta sobre tablas de diferentes bases de datos RRS feed

  • Pregunta

  • Hola a todos, tengo un cursor que va dentro de mi procedimiento almacenado, quiero saber como puedo hacer que el query se ejecute mas rapido, capaz estoy escribiendo el query de una forma que puede mejorarse.

    El query es el siguiente

    DECLARE cur_movprestamo CURSOR FOR
    select p.codigo_p as socio, p.regist_p as registro, p.cuenta_p as cuenta, p.numero_p as numero, p.nombre_p as nombre, p.fecha_p as fecha1, p.feccob_p as fecha2,
    p.recaño_p as año, p.import_p as importe1, p.impegr_p as importe2, p.rubro_p as rubro, p.cuota_p as cuota, p.recibo_p as recibo, p.recanu_p as recanu, p.cajero_p as cajero,
    p.cobrad_p as cobrad, p.factip_p as factura
    from pagos as p inner join cresolicitud as c on p.codigo_p = c.socio_s and p.numero_p = c.crenum_s
    WHERE p.numero_p NOT IN (SELECT CUENTA_OPERATIVA FROM SICMA_CHORRITO.DBO.c_histo_movimientos WHERE cartera = 'P') 
    order by fecha1 asc

    OPEN cur_movprestamo

    FETCH NEXT FROM cur_movprestamo INTO
     @socio,@registro, @cuenta, @numero, @nombre, @fecha1, @fecha2, @año, @importe1, @importe2, @rubro, @cuota, @recibo, @recanu, @cajero,
     @cobrad, @factura

    Pueden fijarse que en el where esta la clausula sobre lo que se discriminan los registros de la otra base de datos.

    Saludos.

    jueves, 24 de noviembre de 2016 14:21

Respuestas

  • Verifica que tengas índices con los campos adecuados para la consulta en cada tabla, la sugerencia sería tener los siguientes:

    Pagos: Codigo_P, Numero_P
    Cre_Solicitud: Socio_S, Crenum_S
    Histo_Movimientos:  cartera

    viernes, 25 de noviembre de 2016 11:49

Todas las respuestas

  • Lo importante sería ver si realmente necesitas crear un cursor, pero en todo caso el select lo puedes cambiar de utilizar un In a un EXISTS:

    WHERE NOT EXISTS(SELECT * FROM SICMA_CHORRITO.DBO.c_histo_movimientos
                                     WHERE CUENTA_OPERATIVA=p.numero_p AND cartera = 'P')

    jueves, 24 de noviembre de 2016 14:31
  • In almost all cases when we use the <> operator (or any other operator in conjunction with the NOT operator, i.e.. NOT IN) index seeks will not be performed and instead a table/index scan is required.

    Por eso te anda lento la query


    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    jueves, 24 de noviembre de 2016 14:41
  • Mira, te dare un par de consejos puntuales, en el 99% de los casos puedes realizar de forma optima tus consultas en TSQL sin requerir el uso de cursores, de hecho debes prevenirlo, siempre recuerdo una frase de Itzik Ben-Gan acerca de los cursores y dice algo como: Usar cursores cuando requieres obtener un registro a la vez, ahora, cuando puedes requerir esta conducta, en pocos casos.  Segundo, el uso de NOT IN conlleva un riesgo asociado a Three Logic Rules, puedes encontrar mas detalles sobre esta en Google escribe Joe Celkos Three Logic , pero en resumen si la columna que estas incluyendo en la subconsulta tiene un valor NULL esto te va a traer inconsistencia en los registros retornadas, por ultimo, estas ejecutando N veces la subconsulta cuando pudieras perfectamente si usas SQL Server 2012 (y esto lo digo por un fallo de rendimiento que fue corregido) usar una variable temporal de tipo Table y ahi almacenas esa consulta y en lugar de estar invocandola N veces solo lo haces una sola vez.

     

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    jueves, 24 de noviembre de 2016 19:25
  • Sobre los que me consultan el porque estoy usando cursores es debido a que se trata de una migracion y solo la usare 3 veces, 1 migracion ya la hice, el segundo corte de datos nuevos ya realice tambien y a fin de anho hare el ultimo. Sigo leyendo sus consejos para ver como implementar, cada migracion me lleva 5 hs y son apenas 600000 registros


    Marta Hermosilla

    viernes, 25 de noviembre de 2016 11:34
  • Verifica que tengas índices con los campos adecuados para la consulta en cada tabla, la sugerencia sería tener los siguientes:

    Pagos: Codigo_P, Numero_P
    Cre_Solicitud: Socio_S, Crenum_S
    Histo_Movimientos:  cartera

    viernes, 25 de noviembre de 2016 11:49