Spring JPA - 与关系一起读取数据 - 性能改进

Posted

技术标签:

【中文标题】Spring JPA - 与关系一起读取数据 - 性能改进【英文标题】:Spring JPA - Reading data along with relations - performance improvement 【发布时间】:2020-09-02 15:57:16 【问题描述】:

我正在使用 Spring JPA 从表中读取数据。 该实体对象与其他六个表具有一对多的关系。 所有表总共有 20,000 条记录。 我正在使用以下查询从数据库中获取数据。

SELECT * FROM A WHER ID IN (SELECT ID FROM B WHERE COL1 = '?')

一个表与其他 6 个表有关系。 Spring JPA 需要大约 30 秒的时间从 DB 中读取这些数据。 任何改善数据获取时间的想法都在这里。

我在这里使用本机查询,我正在寻找可以优化数据获取时间的查询重写。 请建议谢谢。

【问题讨论】:

是的,使用延迟加载。 但是我需要来自所有 6 个表的数据,延迟加载对我有帮助吗? 在这种情况下,我建议您使用该查询创建一个过程(6 个表) TBH JPA 并不完全适合一次性将 20k 条记录提取到持久性上下文中。它会增加一些开销,只是为了将结果水合到对象中,而且您的代码实际上不太可能触发大量小的 SELECTs 来获取相关实体。如果我是你,我会考虑使用精心设计的原生查询(可能带有非实体结果) 【参考方案1】:

您可能需要考虑以下问题来确定根本原因:

检查您是否遇到了 n+1 查询问题。您的查询可能最终会为每个连接表调用 n 个查询,其中 n 为否。与连接表的关联。您可以通过设置spring.jpa.show-sql=true 来检查这一点 如果您看到问题为 n+1,则需要设置适当的 FetchMode,请参阅 https://www.baeldung.com/hibernate-fetchmode 了解使用不同 FetchMode 的详细说明。 如果不是 n+1 查询问题,您可能需要使用 EXPLAIN 命令检查生成的查询的性能。通常,非索引列上的 IN 子句会对性能产生影响。

所以设置spring.jpa.show-sql=true 并检查生成并运行的查询以调试和优化您的代码或查询。

【讨论】:

以上是关于Spring JPA - 与关系一起读取数据 - 性能改进的主要内容,如果未能解决你的问题,请参考以下文章

与spring数据jpa的自引用关系

Spring Boot + Spring Batch + Spring JPA

Spring-JPA 可以与 Postgres 分区一起使用吗?

Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作

将 Spring Boot 与 JPA 一起使用时如何持久化

将多个数据库与 Spring Data JPA 一起使用时,不会发生名为“ConfigurationClassPostProcessor.importRegistry”的 bean 异常