sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
发布时间:2016-12-29 来源:查字典编辑
摘要:复制代码代码如下:--代码一DECLARE@ccINTSELECTNewsId,ROW_NUMBER()OVER(ORDERBYSortNu...

复制代码 代码如下:

--代码一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变化而改变。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新mssql数据库学习
热门mssql数据库学习
编程开发子分类