为什么分页查询比使用Spring Data的普通查询慢?

时间:2017-05-17 10:02:30

标签: spring hibernate spring-data spring-data-jpa jpql

鉴于我有一个简单的查询:

List<Customer> findByEntity(String entity);

此查询在700毫秒内返回7k记录。

Page<Customer> findByEntity(String entity, Pageable pageable);

此查询返回1080ms的10条记录。我知道对分页的额外计数查询,但似乎还是有些东西。我还注意到一件奇怪的事情是,如果我将页面大小从10增加到1900,则响应时间在1080毫秒左右完全相同。

有什么建议吗?

2 个答案:

答案 0 :(得分:9)

这可能确实是计数查询在这里很昂贵。如果你坚持要知道集合中匹配的元素总数,那么很遗憾没有办法解决这个额外的查询。但是,如果你能够牺牲所返回的信息,有两种方法可以避免更多的开销:

  1. 使用Slice作为返回类型 - Slice并未公开方法以了解元素总数,但它可让您了解有关下一个切片是否可用。我们通过读取比请求更多的元素并使用其(非)存在作为下一个切片可用性的指示符来避免计数查询。
  2. 使用List作为返回类型 - 这只会将分页参数应用于查询并返回所选元素的窗口。但是,它不会向您提供有关后续数据是否可用的信息。

答案 1 :(得分:1)

分页方法运行两个查询:

1) select count(e.id) from Entity e //to get number of total records
2) select e from Entity e limit 10 [offset 10] //'offset 10' is used for next pages

第一个查询在7k记录上运行缓慢,恕我直言。

Spring Data的即将发布的Ingalis将使用改进的算法进行分页查询(more info)。

  

有什么建议吗?

我认为使用带有7k记录的分页查询是没用的。你应该限制它。