Próbuję poprawić zapytanie n + 1 o projekcie, nad którym pracuję. Używam Hibernate z modelem pokazanym poniżej i chcę wyrazić zapytanie, aby odzyskać wszystkie pozycje związane z portfelem, w tym dwie ostatnie ceny dla każdej pozycji (cena na podaną datę i poprzednią cenę).Próbuję zoptymalizować zapytanie N + 1 w Hibernate
Przykład API:
List<Items> items = findItemsWithLatestTwoPrices(portfolio, latestPriceDate);
Obecnie używam jedną kwerendę, aby wyodrębnić wszystkie elementy związane z portfela, a potem iteracyjne nad tymi pozycjami kwerendy dwie aktualne ceny na danej pozycji (więc n + 1).
Próbowałem wyrażając to w rodzimym języku SQL za pomocą podzapytania skorelowane, ale wydajność była straszna. To i fakt, że każdego dnia pojawiają się nowe ceny (a więc zapytanie staje się coraz wolniejsze) doprowadziło mnie do wniosku, że potrzebuję innego modelu, ale staram się wymyślić model, który jest rozsądnie skuteczny i stały w miarę upływu czasu. liczba wzrostów cen.
myślałam o różnych rozwiązań w tym reprezentujący ceny jak połączonych listach, lub za pomocą jakiegoś drzewa, ale uważam, że są lepsze alternatywy. Czy brakuje mi czegoś oczywistego? Czy ktoś pracujący nad podobnym problemem wymyślił dobre rozwiązanie?
I naprawdę nie obchodzi pogoda używam HQL lub natywnego SQL tak długo jak wydajność jest przyzwoity. Jestem również otwarty na zmiany w modelu.
Dzięki!
[Edytuj]
Ponieważ mam ponad dwa lata danych dotyczących cen, a tam może być 1000+ pr przedmiotów. portfolio, pobranie całego wykresu prawdopodobnie nie jest dobrym pomysłem. Potrzebuję także dostępu losowego według daty, więc przechowywanie dwóch cen jako pól na produkcie nie jest niestety opcją.
Cześć, dziękuję za odpowiedź. Mam pewne zastrzeżenia przeciwko pobieraniu całego wykresu. Ponieważ ceny są dostępne codziennie, a może być ich nawet 1000 i więcej, oznaczałoby to odzyskanie i utworzenie 73000 obiektów, jeśli masz dwa lata (jak mamy). Zmieniłem moje pytanie, aby dołączyć liczby. Jeśli chodzi o używanie pola dla dwóch cen, które jest pomocne tylko wtedy, gdy zawsze korzystasz z ceny dziennej, ale potrzebuję dostępu losowego według daty. – ebaxt
Może najpierw załadujesz wszystkie elementy z portfolio, a następnie załadujesz wszystkie ceny z datą, której potrzebujesz (w niezależnym drugim zapytaniu). Następnie możesz dopasować przedmioty do cen w pamięci. Dzięki temu można uniknąć obciążenia n + 1. Poza tym nie widzę innej opcji z wyjątkiem szybkiego ładowania całego wykresu. – GeorgeG