Estoy luchando por mejorar una consulta n + 1 en un proyecto en el que estoy trabajando. Utilizo Hibernate con el modelo que se muestra a continuación, y deseo expresar una consulta para recuperar todos los artículos relacionados con una cartera, incluidos los dos últimos precios de cada artículo (precio en la fecha determinada y precio anterior).Luchando para optimizar la consulta N + 1 en Hibernate
API de ejemplo:
List<Items> items = findItemsWithLatestTwoPrices(portfolio, latestPriceDate);
Actualmente utilizo una consulta para extraer todos los artículos relacionados con la cartera, y luego iterar sobre los elementos para consultar los dos últimos precios de un determinado artículo (entonces n + 1).
Intenté expresar esto en sql nativo usando una subconsulta correlacionada, pero el rendimiento fue terrible. Esto y el hecho de que hay nuevos precios todos los días (por lo que la consulta es cada vez más lenta) me ha llevado a pensar que necesito un modelo diferente, pero estoy luchando por encontrar un modelo que sea razonablemente efectivo y constante a lo largo del tiempo. el número de precios aumenta
He estado pensando en diferentes soluciones, incluyendo la representación de precios como listas vinculadas, o el uso de algún tipo de árbol, pero creo que hay mejores alternativas. ¿Me estoy perdiendo algo obvio? ¿Alguien que está trabajando en un problema similar ha tenido una buena solución?
Realmente no me importa si uso HQL o SQL nativo siempre que el rendimiento sea aceptable. También estoy abierto para hacer cambios al modelo.
Gracias!
[Editar]
Ya que tengo más de dos años de datos sobre los precios, y no puede haber más de 1000 artículos pr. cartera, recuperar el gráfico completo probablemente no sea una buena idea. También necesito acceso aleatorio por fecha, por lo que el almacenamiento de los dos precios como campos en el elemento lamentablemente no es una opción.
Hola, gracias por responder. Tengo algunas reservas en contra de obtener todo el gráfico. Como hay precios todos los días, y podría haber hasta 1000+ artículos de cartera, eso significaría recuperar e instanciar 73000 objetos si tiene dos años de precios (como los que tenemos). He editado mi pregunta para incluir los números. En cuanto a usar un campo para los dos precios, eso solo es útil si siempre usas un precio diario, pero necesito acceso aleatorio por fecha. – ebaxt
Tal vez primero pueda cargar todos los artículos de un portafolio y luego cargar todos los precios con la fecha que necesite (en una segunda consulta independiente). Después de eso, puede hacer coincidir los artículos con los precios en la memoria. Al hacer esto, puedes evitar la carga n + 1. Además de eso, no veo otra opción a excepción de impaciente cargando todo el gráfico. – GeorgeG