PiensoPienso: Cual for each tiene mejor performance? #GeneXus
En una base de datos, se tiene la tabla Logs
* LogId (autonumber)
LogDate
LogObservation
Tiene un millón de registros y una distribución uniforme en los diferentes meses.
Tiene un indice de usuario por LogDate, que es del tipo DATE.
Tengo el siguiente código, en un procedure GeneXus, main, command line.
a) Indique que casos demorarán mas.
b) Indique según su criterio que casos demoraran menos.
Justifique sus respuestas.
UPDATE: RESULTADO DE LAS CORRIDAS
En mi maquina con SQLServer 2012 , todo local con C#.
Con lo que hay dos grupos.
Con muy mala performance 6,1,5
Con buena performance 3,2,7
De cualquier forma, me sorprendió la buena performance del 4), pues esperaba menos.
Un pequeño resumen y una tabla con las características de cada for each
* LogId (autonumber)
LogDate
LogObservation
Tiene un millón de registros y una distribución uniforme en los diferentes meses.
Tiene un indice de usuario por LogDate, que es del tipo DATE.
Tengo el siguiente código, en un procedure GeneXus, main, command line.
&ServerDate = ServerDate()
&UnMesAtras = &ServerDate - 30
Msg('Caso 1: where LogDate > ServerDate() - 30 ',status)
for each
where LogDate > ServerDate() - 30
do 'Algo'
endfor
Msg('Caso 2: where LogDate > &ServerDate - 30 ',status)
for each
where LogDate > &ServerDate - 30
do 'Algo'
endfor
Msg('Caso 3: where LogDate > &UnMesAtras ',status)
for each
where LogDate > &UnMesAtras
do 'Algo'
endfor
Msg('Caso 4: if LogDate > &UnMesAtras ',status)
for each
If LogDate > &UnMesAtras
do 'Algo'
endif
endfor
Msg('Caso 5: if LogDate > ServerDate() - 30 ',status)
for each
If LogDate > ServerDate() - 30
do 'Algo'
endif
endfor
Msg('Caso 6: if LogDate + 30 > ServerDate() ',status)
for each
where LogDate + 30 > ServerDate()
do 'Algo'
endfor
Msg('Caso 7: if LogDate + 30 > &ServerDate ',status)
for each
where LogDate + 30 > &ServerDate
do 'Algo'
endfor
'Algo' es una subrutina que demora un tiempo constante.
a) Indique que casos demorarán mas.
b) Indique según su criterio que casos demoraran menos.
Justifique sus respuestas.
UPDATE: RESULTADO DE LAS CORRIDAS
En mi maquina con SQLServer 2012 , todo local con C#.
Con lo que hay dos grupos.
Con muy mala performance 6,1,5
Con buena performance 3,2,7
De cualquier forma, me sorprendió la buena performance del 4), pues esperaba menos.
Un pequeño resumen y una tabla con las características de cada for each
Las que ejecutaron peor, fueron aquellas que por usar ServerDate, se ejecutan en el cliente, haciendo que tengan que traer todos los registros y preguntar por ellos. Ademas se agrega que para cada registro se realiza una invocacion al servidor de base de datos, para ir a buscar la fecha, lo cual enlentece aun mas la cosa.
Se me ocurren varias formas de optimizar lo generado, pero todas tienen algun peligro, de efecto secundario. Por el momento, hay que tener cuidado y revisar bien como se esta navegando.
Y para el que lo quiera, el KBdoctor detecta algunas de estas consultas problemáticas.
Hola Enrique, esto es excelente.
ResponderBorrarLa versión que revisa los Foreachs está commiteada en el marketplace? Gracias!
Si, esta en el marketplace.
ResponderBorrarLo que hace es revisar las navegaciones de los objetos y te muestra aquellas que tienen warnings y avisos que quedan un poco desapercibidos.
Es la opcion que Navigation Procession / Objects with Error y Warning