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

来源:asp之家 时间:2011-09-30 11:09:37 

 代码如下:


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

标签:分页,存储过程
0
投稿

猜你喜欢

  • Python3.7+tkinter实现查询界面功能

    2023-05-16 18:24:54
  • oracle中的视图详解

    2009-12-22 11:48:00
  • pytorch使用 to 进行类型转换方式

    2022-10-05 23:28:27
  • Python模块/包/库安装的六种方法及区别

    2021-11-03 15:53:56
  • PyTorch实现MNIST数据集手写数字识别详情

    2021-08-03 17:30:36
  • Django 多表关联 存储 使用方法详解 ManyToManyField save

    2023-07-10 08:06:55
  • Mysql中Insert into xxx on duplicate key update问题

    2024-01-23 22:32:36
  • python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析

    2022-07-08 06:45:02
  • 详解TensorFlow2实现前向传播

    2021-09-13 02:15:54
  • 简单的文本内容处理工具

    2010-01-28 12:31:00
  • JS代码混淆加密工具

    2008-05-25 13:49:00
  • python实现b站直播自动发送弹幕功能

    2023-07-13 06:58:15
  • 一文带你深入了解Go语言中切片的奥秘

    2024-04-28 10:46:25
  • 百度“有啊”首页首次曝光 以绿色调为主

    2008-10-20 12:52:00
  • 扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路

    2024-04-23 09:25:31
  • 浅谈python中str字符串和unicode对象字符串的拼接问题

    2022-03-27 22:00:32
  • MySQL存储过程savepoint rollback to

    2008-12-03 16:02:00
  • 基于mysql实现group by取各分组最新一条数据

    2024-01-13 05:48:18
  • python爬虫使用cookie登录详解

    2023-10-13 06:36:39
  • mac安装python3后使用pip和pip3的区别说明

    2021-01-06 21:23:15
  • asp之家 网络编程 m.aspxhome.com