Hola Cesar, gracias por contestar.

Lo voy a probar.

Tengo un índice sobre la PK MiTabla.Id.

Supongo que es eso correcto, verdad?



Saludos



ricardo aidelman

( socio nº 1545 )



De: [email protected] [mailto:[email protected]] En nombre de César Pistiner
Enviado el: miércoles, 01 de abril de 2015 11:08 p.m.
Para: GUFA List Member
Asunto: [GUFA] UPDATE - SQL Command vs. Seek() + Gather



Buenas noches Ricardo,



Proba así a ver si mejora:



Update MiTabla Set ;

         Campo1 = MiCursor.Campo1,;

         Campo2 = MiCursor.Campo2,;

         Campo3 = MiCursor.Campo3,;

         Campo4 = MiCursor.Campo4 ;

         From MiTabla Inner Join MiCursor On MiTabla.Id == MiCursor.Id




NOTA: deberías tener índices que te optimicen esto.



De todas formas muchas veces a nosotros nos ha pasado que un scan con seek 
supera ampliamente al update-sql.



Saludos,

César



El 1 de abril de 2015, 21:31, Ricardo Aidelman <[email protected]> 
escribió:

Caballeros:

Tengo una tabla libre MiTabla.dbf, con una PK sobre el campo MiTabla.Id 
(Integer)



Tambien tengo un cursor MiCursor, leído con un Select obre MiTabla, donde 
modifico algunos campos.



Hasta ahora actualizaba MiTabla con el Procedure Grabar1(), pero tenía 
problemas de performance.

Hice pruebas con el Coverage, y el Procedure Grabar2() resultó ser 
infinitamente más veloz.



La preguntaes: está mal el comando Update – SQL, o siempre es preferible el 
Seek() + Gather



La tabla que se actualiza tiene 12500 registros y pesa 4.0Mb.

El cursor que actualiza la tabla tiene 10 registros

Estoy usando VFP9 SP2





Procedure Grabar1()

     Update MiTabla Set ;

         MiTabla.Campo1 = MiCursor.Campo1,;

         MiTabla.Campo2 = MiCursor.Campo2,;

         MiTabla.Campo3 = MiCursor.Campo3,;

         MiTabla.Campo4 = MiCursor.Campo4 ;

         From MiCursor ;

         Where MiTabla.Id = MiCursor.Id





     * Tiempo de Proceso: Avg 0.636852



Endproc







Procedure Grabar2()



     Select MiCursor

     Locate



     Scan



         Scatter Fields ;

              Campo1, Campo2, Campo3, Campo4 Name loReg



         Select MiTabla



         If Seek( MiCursor.Id, "MiTabla", "Id" )



              Rlock()

              Gather Name loReg

              Unlock

         Endif



         Select MiCursor



     EndScan



     * Tiempo de Proceso: Avg 0.078448



Endproc



Muchas gracias





ricardo aidelman

( socio nº 1545 )

Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.es
Versión: 2015.0.5863 / Base de datos de virus: 4321/9433 - Fecha de la versión: 
01/04/2015



Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.es
Versión: 2015.0.5863 / Base de datos de virus: 4321/9433 - Fecha de la versión: 
01/04/2015




-----
Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.es
Versión: 2015.0.5863 / Base de datos de virus: 4321/9437 - Fecha de la versión: 
02/04/2015

Responder a