讲师中心 微信公众号
AI工具推荐 视频效率加速

SQL Server 2019如何实现高效分页查询?

雨强大大_8043

雨强大大_8043

发布时间:2026-08-27 14:10:23

|

255人浏览过

|

来源于php中文网

原创

OFFSET-FETCH 必须显式写 ORDER BY,OFFSET 从 0 开始,FETCH NEXT 后需跟数字+ROWS ONLY,排序字段含 NULL 时需用 ISNULL 控制;深分页性能差因强制扫描前 N 行,需覆盖索引缓解。

sql server 2019如何实现高效分页查询?

SQL Server 2019 中,OFFSET-FETCH 是默认推荐的分页方案,但“高效”不等于“无条件高效”——它在深分页(如第 10000 页)时性能会断崖式下降,必须配合索引和场景选择才能真正高效。

OFFSET-FETCH 必须满足哪些前提才不报错?

OFFSET-FETCH 不是拿来即用的语法糖,它有硬性约束:

  • 必须显式写 ORDER BY,否则报错:The OFFSET clause is invalid unless a corresponding ORDER BY clause is specified.
  • OFFSET 值从 0 开始:第 1 页 → OFFSET 0 ROWS,第 5 页(每页 25 条)→ OFFSET 100 ROWS
  • FETCH NEXT 后必须跟数字 + ROWS ONLY,漏掉 ONLY 会语法错误
  • 排序字段若含 NULL,ORDER BY col DESC 会让 NULL 排最前,影响分页一致性;可用 ORDER BY ISNULL(col, '1900-01-01') DESC 控制

为什么 OFFSET 越大越慢?怎么缓解?

OFFSET 50000 ROWS 不代表跳过 5 万行索引查找,而是强制 SQL Server 扫描并计数前 5 万行——哪怕你只取最后 20 条。这是它的底层行为,不是 bug。

  • 唯一有效缓解方式:给 ORDER BY 字段建**覆盖索引**,例如 CREATE INDEX IX_posts_created_at_id ON posts(created_at DESC, id DESC)
  • 避免在无索引字段上分页,否则执行计划会出现 Sort 操作,内存压力陡增
  • 如果业务允许,把 OFFSET 计算改为 BIGINT 类型,防止 page * size 溢出 INT 上限(2147483647)

什么时候必须改用 ROW_NUMBER()?

当你要在单次查询中同时拿到分页数据和总记录数,OFFSET-FETCH 就做不到——它不提供总数,而 ROW_NUMBER() 可以配合 COUNT(*) OVER() 实现。

  • 必须用 CTE 或子查询包裹,否则 WHERE 会在 ROW_NUMBER() 计算前执行,导致逻辑错误
  • 聚合后分页(如 GROUP BY)无法直接套 OFFSET-FETCH,得先聚合,再用 ROW_NUMBER() 包一层
  • 多排序字段(如 ORDER BY status ASC, created_at DESC)时,ROW_NUMBER() 的 OVER 子句写法更可控,OFFSET-FETCH 容易因 NULL 处理不一致导致跨页重复或漏行

深分页(>1000 页)还有没有更快的路?

真要查第 50000 页,OFFSET-FETCH 和 ROW_NUMBER() 都会卡在 5 秒以上。这时候该换思路:用**游标分页(Keyset Pagination)**,基于上一页最后一条的排序键值做条件过滤。

  • 示例:上一页最后一条是 created_at = '2024-01-15', id = 12345,下一页查:SELECT TOP 25 * FROM posts WHERE created_at 12345) ORDER BY created_at DESC, id DESC
  • 它不依赖偏移量,查询耗时恒定(约 3ms),但要求排序字段组合能唯一标识一行(主键或带唯一约束的列)
  • 不能跳转任意页码,只支持“下一页/上一页”,适合无限滚动或翻页按钮场景

真正容易被忽略的点:分页性能不只取决于写法,更取决于索引是否匹配排序方向、是否覆盖查询字段、以及业务是否真的需要跳转到极深页码——很多所谓“第 10000 页”的需求,其实只是前端没做限制的副作用。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5911

2023.08.11

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2845

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

4021

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

3171

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

1007

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2767

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2767

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2913

2023.10.16

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn