sqlserver 三种分页方式性能比较[图文]

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

Liwu_Items表,CreateTime列建立聚集索引

第一种,sqlserver2005特有的分页语法

代码如下:


declare @page int
declare @pagesize int
set @page = 2
set @pagesize = 12

SET STATISTICS IO on
SELECT a.* FROM (
SELECT ROW_NUMBER() OVER (ORDER BY b.CreateTime DESC) AS [ROW_NUMBER], b.*
FROM [dbo].[Liwu_Items] AS b ) AS a
WHERE a.[ROW_NUMBER] BETWEEN @pagesize + 1 AND (@page*@pagesize)
ORDER BY a.[ROW_NUMBER]


结果:

(12 行受影响)表 'Liwu_Items'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
  逻辑读是7次

执行计划:

主要开销都在聚集索引扫描了。

第二种,用两个top分别正序和倒序排列,共另个子查询来实现分页,

代码如下:


declare @page int
declare @pagesize int
set @page = 2
set @pagesize = 12

SET STATISTICS IO on
select * from (
select top (@pagesize) * from
(select top (@page*@pagesize) * from Liwu_Items order by CreateTime desc) a
order by CreateTime asc) b
order by CreateTime desc


结果

(12 行受影响)表 'Liwu_Items'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 317 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
  执行计划

执行计划和第一种差不多,但两个排序占的资源挺多的。

第三种,最垃圾的一种,用not in字句实现的,如下

代码如下:


declare @page int
declare @pagesize int
set @page = 2
set @pagesize = 12

SET STATISTICS IO on
select top(@pagesize) * from Liwu_Items
where ItemId not in(
select top((@page-1)*@pagesize) ItemId from Liwu_Items order by CreateTime desc)
order by CreateTime Desc


结果

(12 行受影响)表 'Worktable'。扫描计数 1,逻辑读取 70 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'Liwu_Items'。扫描计数 2,逻辑读取 18 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
  性能最差,对两个表进行处理,逻辑读都很高,汗。

执行计划

这执行计划都看不懂,嵌套循环和表假脱机占了很大的资源。


总结:第二种分页方法和第一种分页方法效率差不多,但第二种可用于老版本的sqlserver甚至access,最后一种别用。

标签:分页方式,性能比较
0
投稿

猜你喜欢

  • Python解释器以及PyCharm的安装教程图文详解

    2021-04-09 11:56:32
  • Python轻量级ORM框架Peewee访问sqlite数据库的方法详解

    2024-01-23 06:47:45
  • python QT界面关闭线程池的线程跟随退出完美解决方案

    2023-01-01 11:56:21
  • MySql总弹出mySqlInstallerConsole窗口的解决方法

    2024-01-18 20:01:23
  • js+css在交互上的应用

    2024-04-17 10:37:49
  • python图片指定区域替换img.paste函数的使用

    2023-10-17 02:34:01
  • python 从list中随机取值的方法

    2021-10-06 04:08:11
  • python安装模块如何通过setup.py安装(超简单)

    2023-06-13 00:46:30
  • Mysql5.6修改root密码教程

    2024-01-20 01:10:23
  • 详解用python -m http.server搭一个简易的本地局域网

    2023-09-29 13:03:34
  • MSSQL段落还原脚本,SQLSERVER段落脚本

    2024-01-22 14:48:15
  • Python编程pytorch深度卷积神经网络AlexNet详解

    2022-02-18 10:28:40
  • python做量化投资系列之比特币初始配置

    2021-06-28 06:01:31
  • python入门游戏之井字棋实例代码

    2021-07-13 20:26:48
  • 解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题

    2023-11-11 10:38:14
  • Matplotlib 生成不同大小的subplots实例

    2022-12-22 03:16:26
  • Python txt文件如何转换成字典

    2022-01-10 21:55:05
  • pygame实现俄罗斯方块游戏(对战篇1)

    2023-05-29 16:23:44
  • JS中call/apply、arguments、undefined/null方法详解

    2024-04-19 11:01:31
  • jenkins配置163邮箱的操作方法

    2023-08-10 22:54:05
  • asp之家 网络编程 m.aspxhome.com