手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
摘要:复制代码代码如下:--代码一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变化而改变。

【sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】】相关文章:

Sql Server 2000删除数据库备份文件

目前用到的两个分页存储过程代码

sqlserver 通用分页存储过程

SQL Server扩展存储过程实现远程备份与恢复

SQL Server存储过程的基础说明

SQL Server数据库中的存储过程介绍

SQL Server使用Merge语句当源表数据集为空时,无法进行查询的问题

SQL小技巧 又快又简单的得到你的数据库每个表的记录数

在程序中压缩sql server2000的数据库备份文件的代码

Sql语句与存储过程查询数据的性能测试实现代码

精品推荐
分类导航