SQL Server 分页存储过程的优化【让数据库按我们的意思执行查询计划】

2022-11-12 09:47:55
内容摘要
这篇文章主要为大家详细介绍了SQL Server 分页存储过程的优化【让数据库按我们的意思执行查询计划】,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做
文章正文

这篇文章主要为大家详细介绍了SQL Server 分页存储过程的优化【让数据库按我们的意思执行查询计划】,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

代码如下:

 
--代码一DECLARE @cc INT 
SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC) AS RowIndex INTO #tb FROM news WITH(NOLOCK) WHERE NewsTypeId=@NewsTypeId AND IsShow=1 
SET @cc = @@ROWCOUNT 
SELECT n.* FROM news AS n WITH(NOLOCK), #tb As t WHERE t.RowIndex>@PageIndex*@PageSize AND t.RowIndex<=(@PageIndex+1)*@PageSize AND t.newsid=n.newsid 
SELECT @cc 
DROP TABLE #tb 

代码如下:

 
--代码二 
DECLARE @cc INT 
SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC) AS RowIndex INTO #tb FROM news WITH(NOLOCK) WHERE NewsTypeId=@NewsTypeId AND IsShow=1 
SET @cc = @@ROWCOUNT 
SELECT NewsId INTO #tb2 FROM #tb As t WHERE t.RowIndex>@PageIndex*@PageSize AND t.RowIndex<=(@PageIndex+1)*@PageSize 
SELECT * FROM news WITH(NOLOCK) WHERE NewsId IN (SELECT * FROM #tb2) 
SELECT @cc 
DROP TABLE #tb 
DROP TABLE #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变化而改变。

注:关于SQL Server 分页存储过程的优化【让数据库按我们的意思执行查询计划】的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!