Я пытаюсь улучшить n + 1 запрос для проекта, над которым я работаю. Я использую Hibernate с моделью, показанной ниже, и хочу выразить запрос для извлечения всех элементов, связанных с портфелем, включая последние две цены на каждый элемент (цена на данную дату и предыдущую цену).
Пример API:
List<Items> items = findItemsWithLatestTwoPrices(portfolio, latestPriceDate);
В настоящее время я использую один запрос для извлечения всех элементов, связанных с портфелем, а затем перебираю эти элементы для запроса двух последних цен на данный элемент (так что n + 1).
Я пытался выразить это в нативном sql, используя коррелированный подзапрос, но производительность была ужасной. Это и тот факт, что каждый день появляются новые цены (поэтому запрос становится все медленнее), заставляет меня думать, что мне нужна другая модель, но я изо всех сил пытаюсь придумать модель, которая является достаточно эффективной и постоянной с течением времени, так как количество цен увеличивается.
Я думал о различных решениях, включая представление цен в виде связанных списков или использование какого-то рода деревьев, но я считаю, что есть лучшие альтернативы. Я что-то упускаю из виду? Кто-нибудь, работающий над подобной проблемой, придумал хорошее решение?
Меня не волнует, использую ли я HQL или нативный SQL, если производительность приличная. Я также открыт для внесения изменений в модель.
Спасибо!
[Edit]
Поскольку у меня есть данные о ценах за два года, и их может быть более 1000 штук. портфолио, получение всего графика, вероятно, не очень хорошая идея. Кроме того, мне нужен произвольный доступ по дате, поэтому, к сожалению, хранить эти две цены в качестве полей на элементе невозможно.