sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
2023-06-13 09:14:30 时间
--代码一DECLARE@ccINT
SELECTNewsId,ROW_NUMBER()OVER(ORDERBYSortNumDESC)ASRowIndexINTO#tbFROMnewsWITH(NOLOCK)WHERENewsTypeId=@NewsTypeIdANDIsShow=1
SET@cc=@@ROWCOUNT
SELECTn.*FROMnewsASnWITH(NOLOCK),#tbAstWHEREt.RowIndex>@PageIndex*@PageSizeANDt.RowIndex<=(@PageIndex+1)*@PageSizeANDt.newsid=n.newsid
SELECT@cc
DROPTABLE#tb
--代码二
DECLARE@ccINT
SELECTNewsId,ROW_NUMBER()OVER(ORDERBYSortNumDESC)ASRowIndexINTO#tbFROMnewsWITH(NOLOCK)WHERENewsTypeId=@NewsTypeIdANDIsShow=1
SET@cc=@@ROWCOUNT
SELECTNewsIdINTO#tb2FROM#tbAstWHEREt.RowIndex>@PageIndex*@PageSizeANDt.RowIndex<=(@PageIndex+1)*@PageSize
SELECT*FROMnewsWITH(NOLOCK)WHERENewsIdIN(SELECT*FROM#tb2)
SELECT@cc
DROPTABLE#tb
DROPTABLE#tb2
答案是代码二远远高于代码一。在代码一中加粗代码的操作会引起整表扫描,因为数据库引擎在认为WHERE表达式中满足条件记录大于一定阀值的时候,就不再去进行查询优化,而直接使用表扫描。看执行信息,:
表"news"。扫描计数1,逻辑读取342次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
(98361行受影响)
(1行受影响)
(40行受影响)
表"#tb________________________________________00000004C024"。扫描计数1,逻辑读取257次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
表"news"。扫描计数1,逻辑读取2805次,物理读取0次,预读235次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
(1行受影响)
(1行受影响)
原本,我想的执行计划,加粗部分的代码应该是聚焦索引查找,这样性能就提高很多。看代码二:
表"news"。扫描计数1,逻辑读取342次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
(98361行受影响)
(1行受影响)
表"#tb____________________________________00000004BEEF"。扫描计数1,逻辑读取257次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
(40行受影响)
(1行受影响)
(40行受影响)
表"news"。扫描计数0,逻辑读取131次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
表"#tb2___________________________________00000004BEF0"。扫描计数1,逻辑读取2次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。
(1行受影响)
(1行受影响)
很明显,代码二与代码一中的IO操作数大大降低。且代码一随着@PageIndex越来越大,效率会越来越低;但代码二的效率不会随@PageIndex变化而改变。
相关文章
- SQLServer 并集:如何合并多个表的数据?(sqlserver并集)
- SQLServer测试:如何确保数据库性能和安全性?(sqlserver测试)
- 手机快速查询SQL Server数据库(手机查sqlserver)
- 利用微型SQLServer提升企业的数据库运算能力(微型sqlserver)
- 精通SQLServer:张亮成功之路(张亮sqlserver)
- 数据库建立SQLServer数据库:一步一步到达成功(建立sqlserver)
- 如何实现SQLServer数据库的连接(如何连sqlserver)
- 分布式SqlServer:改变数据存储方式的新动力(分布式sqlserver)
- 介绍SQLServer:为您的数据库添加一抹明亮的色彩(介绍sqlserver)
- VB程序设计与SQLServer数据库集成实现(vb sqlserver)
- SQL Server 数据库被恶意攻击如何防止SQL Server 数据库受到恶意攻击(sqlserver 阻止)
- 如何使用SQLServer检查数据库锁定(sqlserver锁检查)
- 使用C连接SQLServer数据库(sqlserver链接c)
- 进入SQLServer迷你版的新世界(sqlserver迷你版)
- 数据库SQLServer与达梦数据库:如何实现高效协同(sqlserver 达梦)
- SQL Server数据库表空间:存储与优化的利器(sqlserver表空间)
- 技术使用SQLServer网页技术开发丰富交互网站(sqlserver 网页)
- 黑客利用SQLServer数据库成功实施盲注入攻击(sqlserver盲注入)
- sqlserver数据库撤销操作的重要性(sqlserver 撤销)
- 优化SQLServer数据库提交速度(sqlserver 提交)
- SQL Server数据库的高性能运行(sqlserver 开头)
- 使用SQL Server实现强大数据库备份(sqlserver库备份)
- SQLServer数据库定价模式分析(sqlserver定价)
- SqlServer设置双主键:实现安全可靠的数据存储(sqlserver双主键)
- 版数据库处理更轻松——个人版SqlServer(sqlserver个人)
- SQLServer与前端交互:实现智能数据驱动应用(sqlserver与前端)
- SQL Server数据库:实现信息持久存储的数据库技术(sqlserver db)
- SqlServer下数据库链接的使用方法