欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-09 15:55:33
复制代码 代码如下: --代码一declare @cc int select newsid,row_number() over(order by sortnum desc)...
复制代码 代码如下:

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