31/07/2022
Diferencia entre Eager Loading y Lazy Loading en ORMs.
Hace unos días en el trabajo me encontré con esta query que tardaba 1:30 minutos en ejecutarse. Como podrán imaginarse este tiempo, para traer una lista de 400 cursos, es una gran mi**da.
Descubrí por la mala que mi ORM por defecto hacía Lazy Loading. Lo que quiere decir que:
Cada Curso tiene un Estado, Nivel, Tipo y varias Tags. Con Lazy Loading lo que ocurre es que el ORM primero trae los Cursos y después, por cada Curso envia una query para traer su respectivo Estado, Nivel, Tipo y Tags. Obviamente, en 400 Cursos esto resulta en 400 * 4 solicitudes.
Esto es porque el Lazy Loading no es para que traigas todas las tablas asociadas (Estado, Nivel, Tipo, Tags) con tu tabla principal (Cursos). Si quieres hacer esto debes usar Eager Loading. Lo que hace es crear una sola query en la que solicita tu tabla principal y todas sus tablas asociadas (en el caso mío, solicita todos los Cursos y sus respectivos Estado, Nivel, Tipo y Tags).
Tras aplicar esta modificación conseguí que la query pase de 1:30 minutos a 5-9 segundos, lo que es una gran mejora. Pero sigue siendo lento para mí. Así que seguiré investigando donde mas se puede optimizar.
Lo que si es seguro, es que voy a agregar Redis (para cachear los resultados, y reducir aun mas los tiempos).