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.


&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. 



Comentarios

  1. Hola Enrique, esto es excelente.
    La versión que revisa los Foreachs está commiteada en el marketplace? Gracias!

    ResponderBorrar
  2. Si, esta en el marketplace.
    Lo 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

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.