sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
<div class="codetitle"><a style="CURSOR: pointer" data="67225" class="copybut" id="copybut67225" onclick="doCopy('code67225')"> 代码如下:
<div class="codebody" id="code67225">
--
代码一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
<div class="codetitle">
<a style="CURSOR: pointer" data="58939" class="copybut" id="copybut58939" onclick="doCopy('code58939')"> 代码如下:
<div class="codebody" id="code58939">
--
代码二
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变化而改变。
原文链接:https://www.f2er.com/mssql/63989.html