【问题标题】:optimizing Spring Boot JPA query优化 Spring Boot JPA 查询
【发布时间】:2016-11-04 15:11:02
【问题描述】:

我是 Jpa 的新手。我有一个 List 列表,其中包含大约 10000-50000 个客户端对象。

我正在遍历此列表并查询每个客户是否进行过这样的购买:

List<TransactRepViewModel> temporalList = transactRepViewRepository
        .findByClientIdAndClDateBetween(clieTabModel.getClientId(),
                reportInterval.getStartDate(),
                reportInterval.getEndDate());

TransactRepViewRepository.class 方法如下所示:

List<TransactRepViewModel> findByClientIdAndClDateBetween(
        String clientId, Date startDate, Date endDate) throws DataAccessException;

我真的很想改进我的搜索时间,因为遍历如此多的客户需要相当长的时间。有什么我可以使用的技术吗?

【问题讨论】:

  • 写一个“findAll”查询?
  • 你能详细说明一下吗?
  • 在您的 JPA 存储库中编写一个新方法。此方法可能类似于:findAllByStartDateEndDate。此链接可能会有所帮助:docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/…
  • 这不会缩短搜索时间。
  • 如此庞大的客户名单从何而来?如果它来自另一个查询,那么您应该使用带有连接的单个查询。如果它来自其他地方,请考虑使用 in 子句一次传递多个客户端 ID。但请注意,大多数数据库都会限制 in 子句中的值数量和/或查询的长度。例如,Oracle 的限制为 1000。不过,这会将查询数量从 50000 减少到 50。

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

如果不了解更多有关您要做什么的信息,很难提出具体的建议,但通常:

  • 执行一个大型查询,例如,创建一个存储库方法来查找您感兴趣的日期之间的所有购买,并确保结果包含客户 ID .然后在返回结果后将结果与 Java 代码中的客户端进行匹配。这避免了可能执行数千个数据库查询的开销。您可能希望按客户 ID 和购买日期“订购”。

  • 确保在涉及的表上有正确的索引,并验证当 jpa 执行它的查询时,数据库使用索引。表扫描可能会降低性能。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2014-03-29
    • 2021-10-13
    • 2016-10-05
    • 2012-05-18
    • 2021-09-15
    • 2022-01-24
    • 2017-04-01
    相关资源
    最近更新 更多