You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data带order by查询时Slice是否比Page性能更优

结论

即使查询包含order by子句,org.springframework.data.domain.Slice的性能优势仍然存在,你给出的两个示例中,使用Page的版本执行速度确实慢于Slice版本。


核心原因分析
  • Page返回值的底层固定会触发两次查询:
    1. 第一次是全量匹配结果的count(*)统计查询,用于计算总页数、总条目数,Spring Data生成count语句时会自动去掉order by子句,这一步是Slice完全没有的额外开销
    2. 第二次才是带limit、offset和order by的实际数据查询
  • Slice返回值只会触发一次查询:
    为了判断是否存在下一页,只会将查询的limit设置为请求页大小+1,比如你示例中请求页大小为3,实际会查询4条数据,只要返回结果超过3条就标记存在下一页,全程不需要统计全量数据总数。

对应示例的SQL执行差异

第一个使用Page的示例实际执行的SQL

-- 额外的count查询,Slice版本不会执行
select count(*) from employee;
-- 实际数据查询
select * from employee order by name limit 3 offset 0;

第二个使用Slice的示例实际执行的SQL

-- 仅执行一次查询,多查1条判断是否有下一页
select * from employee order by name limit 4 offset 0;

补充说明

如果表数据量极小,count(*)的开销可以忽略不计,两者的性能差异可能感知不到,但本质上Page还是多了一次查询请求的开销,性能劣势始终存在。


内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:09:01