sqlserver关于分页存储过程的优化【让数据库按我
网络编程 2025-03-13 13:00www.168986.cn编程入门
在对两段分页SQL代码进行对比之前,我们先来了解一下背景。假设我们有一个包含15万条记录的news表,其中NewsTypeId=10的有9万条记录。当前我们正在查询NewsTypeId=10的数据,并试图通过分页的方式获取其中的部分数据。
接下来,我们来分析这两段代码:
代码一:
1. 通过`WITH(NOLOCK)`选项,查询新闻数据并创建一个临时表tb。
2. 使用`ROW_NUMBER()`函数为结果集分配行号。
3. 根据给定的页码和每页的数量筛选出需要的数据。
4. 执行一个全表扫描来从news表中获取新闻ID。
存在的问题是,随着页码的增大,全表扫描的开销会越来越大,导致效率降低。加粗部分的代码确实进行了整表扫描,这可能是因为数据库引擎认为WHERE表达式中的条件不足以进行更有效的查询优化。
代码二:
1. 同样使用`WITH(NOLOCK)`选项和`ROW_NUMBER()`函数创建一个临时表tb。
2. 从临时表中筛选出需要的新闻ID并存入另一个临时表tb2。
3. 使用IN子句从news表中获取实际的新闻数据。
与代码一相比,代码二避免了全表扫描,因为它首先筛选出需要的新闻ID(通过临时表tb),然后再从news表中获取实际的新闻数据。这意味着它只需要对news表进行一次扫描,而不是多次。随着页码的变化,代码二的效率相对稳定,不会像代码一那样随着页码的增大而降低效率。
从执行计划来看,代码二的IO操作数大大降低,这进一步证明了其更高的效率。代码二中的聚焦索引查找也提高了性能。基于以上分析,代码二的效率远远高于代码一。
上一篇:按日期选择最晚日期与最早日期对应的数的差值
下一篇:没有了
编程语言
- sqlserver关于分页存储过程的优化【让数据库按我
- 按日期选择最晚日期与最早日期对应的数的差值
- 详解各版本React路由的跳转的方法
- PHP中把对象数组转换成普通数组的方法
- AngularJS 将再发布一个重要版本 然后进入长期支持
- Vue实现动态响应数据变化
- 分享php代码将360浏览器导出的favdb的sqlite数据库文
- 浅谈jQuery绑定事件会叠加的解决方法和心得总结
- PHP_NETWORK_GETADDRESSES- GETADDRINFO FAILED问题解决办法
- jQuery easyui刷新当前tabs的方法
- 基于empty函数的输出详解
- php中get_object_vars()方法用法实例
- JS中常用的输出方式(五种)
- 完美替换html代码
- 以IP与Port建立与SQLSERVER的连接
- php通过文件流方式复制文件的方法