5

我们的 DBA 刚回来,对我们的 SQL 服务器数据库进行了长时间运行的查询。他认为我们应该审查该查询,看看我们是否可以优化。

问题是查询不是来自我们的应用程序代码。它通过主键从单个表中加载许多记录,准确地说是 9 条,并且我们从来没有通过应用程序的主键对该表进行任何查询。它也绝对是一个休眠查询,名称为 hibernate 所做的修改和所有属性的加载。

所以我想知道hibernate是否会做一些预测缓存,比如提取它认为我以后可能想要的记录。对此有任何意见吗?

谢谢。

4

2 回答 2

3

这可能是由于批量获取而执行的查询:

使用批量获取,如果访问一个代理,Hibernate 可以加载多个未初始化的代理。批量抓取是对惰性选择抓取策略的优化。

类/实体的批量获取更容易理解。考虑以下示例:在运行时,您在 Session 中加载了 25 个 Cat 实例,每个 Cat 都有对其所有者的引用,即 Person。Person 类使用代理lazy="true" 进行映射。如果您现在遍历所有猫并在每个猫上调用 getOwner(),默认情况下,Hibernate 将执行 25 个 SELECT 语句来检索代理的所有者。您可以通过在 Person 的映射中指定批量大小来调整此行为:

<class name="Person" batch-size="10">...</class>

Hibernate 现在将只执行三个查询:模式是 10、10、5。

于 2012-07-17T18:51:34.847 回答
0

Hibernate 自己不做任何预测缓存,除了批量获取/子选择获取

但是,Hibernate 可以隐式获取您请求的实体 - 例如,它获取急切关系的目标并在惰性关系的情况下初始化访问的惰性代理。

因此,如果有问题的表充当某些关系的目标,您需要检查这些关系是否急切,以及如果它们是惰性的,您如何访问它们。

于 2012-07-17T19:00:24.270 回答