Попытки оптимизировать запрос N + 1 в Hibernate

Я изо всех сил пытаюсь улучшить запрос n + 1 в проекте, в котором я работа над. Я использую Hibernate с моделью, показанной ниже, и хочу выразить запрос для получения всех элементов, связанных с портфелем, включая последние две цены на каждый элемент (цена на заданную дату и предыдущую цену).

enter image description here

Пример API:

List<Items> items = findItemsWithLatestTwoPrices(portfolio, latestPriceDate);

В настоящее время я использую один запрос для извлечения всех элементов, связанных с портфелем, а затем перебираю эти элементы, чтобы запросить две последние цены на данный элемент (так что n + 1).

Я попытался выразить это в собственном sql используя коррелированный подзапрос, но производительность была ужасной. Это и тот факт, что каждый день появляются новые цены (поэтому запрос становится медленнее), заставили меня подумать, что мне нужна другая модель, но я изо всех сил пытаюсь придумать модель, которая была бы достаточно эффективной и постоянной с течением времени, поскольку количество цен увеличивается.

Я думал о различных решениях, включая представление цен в виде связанных списков или использование какого-то дерева, но я считаю, что есть лучшие альтернативы. Я упускаю что-то очевидное? Кто-нибудь, работающий над подобной проблемой, придумал хорошее решение?

Меня действительно не волнует, использую ли я HQL или собственный SQL, если производительность приличная. Я также готов внести изменения в модель.

Спасибо!

[Edit]

Так как у меня есть данные о ценах за два года, и там может быть 1000+ позиций pr. портфолио, получение всего графика, вероятно, не лучшая идея. Также мне нужен произвольный доступ по дате, поэтому сохранение двух цен в виде полей товара, к сожалению, не вариант.

6
задан ebaxt 12 July 2011 в 05:17
поделиться