努力在Hibernate中优化N + 1查询

eba*_*axt 6 optimization orm hibernate query-optimization data-structures

我正在努力改进我正在进行的项目的n + 1查询.我使用Hibernate与下面显示的模型,我想表达一个查询来检索与投资组合相关的所有项目,包括每个项目的最后两个价格(给定日期和先前价格的价格).

在此输入图像描述

示例API:

List<Items> items = findItemsWithLatestTwoPrices(portfolio, latestPriceDate);
Run Code Online (Sandbox Code Playgroud)

目前我使用一个查询来提取与投资组合相关的所有项目,然后我迭代这些项目以查询给定项目的两个最新价格(所以n + 1).

我尝试使用相关子查询在本机sql中表达这一点,但性能非常糟糕.这个以及每天都有新价格的事实(所以查询变得越来越慢)让我觉得我需要一个不同的模型,但是我很难想出一个合理有效且随时间不变的模型.价格上涨的数量.

我一直在考虑不同的解决方案,包括将价格表示为链表,或使用某种树,但我相信有更好的选择.我错过了一些明显的东西吗 是否有人在解决类似问题时提出了良好的解决方案?

我不太关心我使用HQL或本机SQL,只要性能不错.我也愿意对模型进行更改.

谢谢!

[编辑]

由于我有超过两年的价格数据,并且可以有1000多个项目.投资组合,检索整个图表可能不是一个好主意.此外,我需要按日期随机访问,因此将两个价格作为字段存储在该项目上是不幸的选择.

And*_*s S 0

不确定我\xc2\xb4m 是否抓住了您所有的担忧,但就像您\xc2\xb4ve 可能已经想到的那样,\xc2\xb4s 没有简单的 Hibernate 解决方案。这将取决于您对领域的建模。我认为你\xc2\xb4最好将正常情况和特殊情况分开。您可以在正常域中对它们进行建模,或者对特殊情况使用特殊表示。

\n\n

为了获取 n 个最新奖品,您是否尝试过在关系上设置批量大小?使关系有序(最新的在顶部),然后将批量大小设置为 10 之类的值。这将使 Hibernate 查询 10 和 10 行,并且在外键和顺序列上有索引,它应该在大多数情况下执行正常案例。

\n\n

在我看来,你可以保留额外的关系以及整个关系。不要害怕显式地建模重要关系,例如“上个月的价格”,即使这会是数据的重复。在大多数情况下,应该可以避免数据库中的重复。

\n\n

对于基于日期的随机访问,听起来您\xc2\xb4re最好使用自定义查询,而不是通过域模型访问,如果它们\xc2\xb4re太慢,请考虑使用二级缓存,但我\xc2\xb4m猜测您的访问模式不会从中受益匪浅。

\n