【问题标题】:Spring Data - is Slice faster than Page if it is using order by?Spring Data - 如果使用 order by,Slice 是否比 Page 快?
【发布时间】:2021-12-02 14:11:22
【问题描述】:

如果使用org.springframework.data.domain.Slice 而不是org.springframework.data.domain.Page 来返回可分页的结果通常更快——因为 Slice 不调用 count(*)——如果查询也是按顺序进行排序,它会更快吗?

换个说法,第一个例子比第二个例子吗?

第一个使用Page的例子:

Pageable sortedByName = PageRequest.of(0, 3, Sort.by("name"));
Page<Employee> firstEmployeePage = employeeRepository.findAll(sortedByName);

使用Slice的第二个例子:

Pageable sortedByName = PageRequest.of(0, 3, Sort.by("name"));
Slice<Employee> firstEmployeePage = employeeRepository.findAll(sortedByName);

【问题讨论】:

    标签: spring hibernate spring-data


    【解决方案1】:

    执行Page 与查询Slice 并执行计数查询几乎相同。唯一的区别是Slice 将使用LIMIT (n+1)。有了这些知识,您应该了解切片执行总是更快,因为计数查询通常必须通过某种方式“访问所有行”以确定计数。

    【讨论】:

    • 我真正想知道的是,当使用“order by”时,Page 和 Slice 是否具有相同的性能。据我了解,当执行“order by”时,引擎应该在返回页面/切片之前遍历所有行,所以即使 Slice 没有执行 count(*),它已经遍历了所有行(因为它必须知道顺序),因此我希望两者(切片和页面)具有相同的性能。
    • count 查询仍然需要查看一些数据结构,可能会做join,对于大表做IO,所以count 查询会让一切变得更慢。切片或页面没有排序就没有意义,所以你总是需要order by
    猜你喜欢
    • 2017-01-16
    • 2019-01-27
    • 1970-01-01
    • 2011-09-15
    • 2017-09-25
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多