如何分析JPA/Hibernate数据库查询以提高效率

mfuanj7w  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(188)

我们正在使用Sping Boot with Hibernate连接postgresql数据库,并注意到一些查询比预期的要慢得多。有什么好的工具或方法来找出为什么会发生这种情况吗?我们正在使用Sentry,所以我对哪些语句是问题有一些见解,例如:

我们可以看到,BookingLegRepository.findByStartTimewindowStartBetweenAndDistributorId需要很长时间,而其他存储库的获取速度相当快。ScheduledLegRepository.findByStartTimeBetweenAndAssignment_Distributor_Id获取的对象数量与BookingLegRepository.findByStartTimewindowStartBetweenAndDistributorId相似。
现在,我想知道这是否是因为查询没有被有效地定义:

@Query("select b from BookingLegEntity b left join fetch b.belongsTo where b.startTimewindowStart between ?1 and ?2 and b.distributor.id = ?3")
List<BookingLegEntity> findByStartTimewindowStartBetweenAndDistributorId(Instant from, Instant to, UUID distributorId);

或者这是因为Hibernate在后台进行的一些缓存使得后续调用更快(scheduled-leg和booking-leg彼此关联)。
而且,我无法想象数据库本身是查询速度慢的原因,所以我一直在想是不是Hibernate创建Java对象花费了太多时间。
有没有什么好办法可以让我们更好地了解我们的问题?

f0brbegy

f0brbegy1#

有没有什么好办法可以让我们更好地了解我们的问题?
当然,第一步是记录Hibernate执行的实际SQL,或者通过设置属性:

<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.highlight_sql">true</property>

或者将日志类别org.hibernate.SQL设置为debug
您绝对不可能通过将Spring存储库当作黑盒来分析数据访问代码的性能,任何Java监视或分析工具也不可能非常有用,因为您真正需要做的是最小化到数据库服务器的往返。

相关问题