MSSQL 2005 分页分析及优化

MSSQL 分页方式说明:
目前我所知的有以下几种方式

  • 临时表
  • 表变量
  • in, not in
  • SET ROWCOUNT
  • CTE
  • id >, id <

优缺点分析: 性能最低, 可操作性差
第一种方式和第二种方实际上是比较类似的.
优点: 排序方式比较随意
缺点:
第一种方式 有大量的 IO 开销.
第二种方式则会开销内存, 但当表数据量比较大的时候性能会直线下降.
所以这两种方式都不适合做大数据量的分页.

第三种方式: 性能次之, 可操作较差
优点: 排序方式比较随意
缺点: 资源开销比较大, 数据库会承担不小的运算压力, 所以也不适合做大表分页.

第四种方式: 性能平均, 可操作性尚可
优点: 排序相对比较随意, 各分页情况下速度平均, 属于不是最快也不是最慢.
缺点: 没有明显缺点.

第五种方式: 性能较好, 可操作性良好
优点: 排序相对比较随意, 代码简洁, 适用面广.
缺点: 尾页速度比较慢(需针对优化).

第六种方式: 性能最好, 可操作性比较差
优点: 速度快.
缺点: 尾页速度比较慢(需针对优化), 对排序键有要求.

PS: 以上内容居于以前测试结果说得.

测试用库 DB_PagingTest, 测试用表: Paing_New
主键: ID Desc
总记录 @RecordCount: 10000331
分页尺寸 @PageSize: 30
总页数 @PageCount: 333345
请求页 @AbsolutePage

分页情况分析:

  • @AbsolutePage == 1
  • @AbsolutePage < @PageCount/2
  • @AbsolutePage >= @PageCount/2
  • @AbsolutePage == @PageCount

情况 1:
请求页等于第一页, 这种情况是最简单的.

复制内容到剪贴板
代码:
Select TOP @PageSize * From [Paing_New] Order BY ID Desc

情况 2:
请求页小于总页数/2

复制内容到剪贴板
代码:

    WITH CTE AS
    (
      SELECT TOP @AbsolutePage * @PageSize
      *
      ROW_NUMBER() Over (Order By ID Desc) as _RowNumber
      FROM [Paing_New]
    )
    SELECT
      *
    FROM CTE
    WHERE _RowNumber > (@AbsolutePage - 1) * @PageSize);

情况 3:
请求页大于等于总页数/2
理论上 请求页等于总页数/2的时候应该也有优化方法.

复制内容到剪贴板
代码:

    WITH CTE AS
    (
      SELECT TOP @RecordCount - (@AbsolutePage - 1) * @PageSize
      *,
      ROW_NUMBER() Over (Order BY ID Asc) as _RowNumber
      FROM [Paing_New]  
    )
    SELECT
      *
    FROM CTE
    WHERE _RowNumber > (@RecordCount - @AbsolutePage * @PageSize) Order BY ID Desc;

情况 4:
请求页等于总页数

复制内容到剪贴板
代码:

    WITH CTE AS
    (
      SELECT TOP @RecordCount - (@AbsolutePage - 1) * @PageSize
      *,
      ROW_NUMBER() Over (Order BY ID Asc) as _RowNumber
      FROM [Paing_New]  
    )
    SELECT
      *
    FROM CTE Order BY ID Desc;

数据测试结果:
第 30 条, 即 1 页, CPU 时间 = 0 毫秒,占用时间 = 1 毫秒, 实际执行时间 = 0 毫秒;
第 1W 条, 即 334 页, CPU 时间 = 0 毫秒,占用时间 = 3 毫秒, 实际执行时间 = 0 毫秒;
第 10W 条, 即 3334 页, CPU 时间 = 31 毫秒,占用时间 = 26~28 毫秒, 实际执行时间 = 16~33 毫秒;
第 100W 条, 即 3334 页, CPU 时间 = 250~260 毫秒,占用时间 = 250~260 毫秒, 实际执行时间 = 250~260 毫秒;
第 5000130 条(中间页), 即 166671 页, CPU 时间 = 1200~1300 毫秒,占用时间 = 1200~1300 毫秒, 实际执行时间 = 1200~1300 毫秒;
第 5000160 条(中间页), 即 166672 页, CPU 时间 = 3400~3600 毫秒,占用时间 = 3400~3600 毫秒, 实际执行时间 = 3400~3600 毫秒;
第 9000331 条, 即 300012 页, CPU 时间 = 266~281 毫秒,占用时间 = 273~285 毫秒, 实际执行时间 = 266~296 毫秒;
第 9900331 条, 即 330012 页, CPU 时间 = 31~32 毫秒,占用时间 = 29~30 毫秒, 实际执行时间 = 30~33 毫秒;
第 9999331 条, 即 333312 页, CPU 时间 = 0 毫秒,占用时间 = 2~3 毫秒, 实际执行时间 = 0 毫秒;
第 10000331 条(尾页), 即 333345 页, CPU 时间 = 0 毫秒,占用时间 = 1 毫秒, 实际执行时间 = 0 毫秒;
PS: 关于时间的说明, CPU 时间和占用时间为 MSSQL 的统计结果, 实行时间是人为技术所得;

分页方案优点:
对分页多数情况进行了针对优化, 并且可以对非主键和顺序编号等情况进行分页.
开始和结尾速度都非常快, 因为选择的记录集相对较少.

分页方案缺点:
请求页在总页数中间的时候速度比较慢.


结论:
对于使用 ID 为主键索引的分页, 还是使用传统的 ID 大于或小于这种方式最好.
对于分页主键不明确的, 使用 CTE 的方式比较好

转载于:https://www.cnblogs.com/qanholas/archive/2012/01/06/2314230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 如何实现前端代码实时预览效果?

[html] 如何实现前端代码实时预览效果&#xff1f; setInterval(() > { //刷新逻辑 }, 60)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

vCenter线上操作磁盘扩容

以下截图是生产机器&#xff0c;目前是有一块盘&#xff0c;且根分区是/dev/sda3&#xff0c;因为磁盘不足&#xff0c;需要备份的数据要远远超过此时的空间大小&#xff1b;正常情况下&#xff0c;是可以新增硬盘硬盘作为备份 但是作为宿主机下的虚机&#xff0c;因为一些不规…

邮箱无权访问 上的 jira是怎么回事_蚂蚁庄园答案2020年11月6日汇总 小鸡宝宝考考你每日答案为你呈上|蚂蚁|庄园-360GAME...

川北在线核心提示&#xff1a;原标题&#xff1a; 蚂蚁庄园答案2020年11月6日汇总 小鸡宝宝考考你每日答案为你呈上 支付宝蚂蚁庄园小课堂11月6日答案是什么呢&#xff1f;2020年11月6日支付宝蚂蚁庄园小课堂题目是健身过后什么时候吃饭更适宜&#xff1f;等等相信有不少用户都…

python web py官网_python web.py

web.py1.安装&#xff1a;wget http://webpy.org/static/web.py-0.37.tar.gztar xvfz web.py-0.37.tar.gzcd web.py-0.37sudo python setup.py install2.需求&#xff1a;先说下需求&#xff0c;http://10.75.7.237:8080/?ipaddress10.75.7.29&count100 &#xff0c;最终得…

Razor 也可说是一个asp.net模板引擎,用不着学习 T4 了

Razor 是 ASP.NET MVC 3.0 支持的一个新的视图引擎&#xff0c;但只要你愿意&#xff0c;也可以摆脱 MVC 框架&#xff0c;而把它用作普通的文本模板引擎。这样也许我们不用学习流行的 T4 了&#xff1f;参见思归的博客&#xff1a;http://www.k518.com 转载于:https://www.cnb…

[html] 请说说input的inputmode属性有什么应用场景?

[html] 请说说input的inputmode属性有什么应用场景&#xff1f; inputmode 全局属性 是一个枚举属性&#xff0c;它提供了用户在编辑元素或其内容时可能输入的数据类型的提示。它可以是以下值&#xff1a;"none" 无虚拟键盘。在应用程序或者站点需要实现自己的键盘输…

php操作kafka

php操作kafka----可以参照网上的安装步骤&#xff0c;先安装ldkafka rdkafka&#xff0c;然乎启动zookeeper和kafka服务器<?php //$conf new Rdkafka\Producer(); //$producer new RdKafka\Producer(); class kafka {public $broker_list"localhost:9092";publ…

ligergrid 奇偶行效果_怎么护发才是真的有效果的?

我之前就是喜欢烫染头发&#xff0c;还不注意保护我的头发&#xff0c;时间久了我的头发不仅干燥开叉&#xff0c;还掉的就越来越多了&#xff0c;发量也在一点点的减少&#xff01;头发出油也就算了&#xff0c;脱发我是不能忍了&#xff0c;经过一段时间的不断尝试&#xff0…

bmp怎么编辑底色_非标机械设计这个行业前景怎么样

今天就不分享技术点了&#xff0c;主要和大家谈谈非标机械设计这个行业的前景怎么样&#xff0c;非标机械设计&#xff0c;就是根据客户提供的样板或者提出的要求来订做设计的。相信还有很多人对这个词感到很陌生&#xff0c;提起来也只是大概知道它是一种什么东西&#xff0c;…

android 发短信 调到联系人

原文找不到了。看了别人的一些。自己加了一点。做一个代码备份。自己看就可以了。先上一下图吧。看看一效果。 通过上边选择联系人。把选择过的联系显示到EditView 中。而发送短信时。可以获取联系人的电话号码。 发短信的的类SendmessageActivity.java package com.hkrt.actio…

常用方法 DataTable转换为Entitys

备注&#xff1a;摘自网上 有附地址 public static List<T> DataTableToEntities<T>(this DataTable dt) where T : class, new(){if (null dt || dt.Rows.Count 0) { return null; }List<T> entities new List<T>();List<string> columnName…

[html] 使用history路由方式时,你有自己动手配置过服务器端吗?为什么要配服务器端?怎么配?

[html] 使用history路由方式时&#xff0c;你有自己动手配置过服务器端吗&#xff1f;为什么要配服务器端&#xff1f;怎么配&#xff1f; history路由会请求服务器&#xff0c;因此需要服务器配合返回一个固定的index.html页面 以nginx配置为例&#xff1a; location / { try…

优麒麟桌面闪烁_稳定性持续增强,优麒麟 19.10.1 发布

优麒麟开源操作系统通过研发用户友好的桌面环境以及特定需求的应用软件&#xff0c;为全球用户提供更稳定更易用的 Linux 开源桌面操作系统。此次发布的优麒麟 19.10.1 版本为更新版本&#xff0c;内核版本升级至5.3.0.19.22&#xff0c; 火狐浏览器升级至70.0 版本&#xff0c…

智能机器人及其应用ppt课件_机器人视觉技术在建筑智能化生产中的应用

近年来&#xff0c;随着工业智能化的发展&#xff0c;有许多智能施工机器人走向了建筑领域&#xff0c;但是这些机器人在建筑行业相关部件产线推进过程中&#xff0c;发现传统的机器人应用方法不能很好的满足实际生产的需求。例如建筑行业的钢结构部件&#xff0c;都是些大型且…

云计算第二阶段shell脚本

pstree           #查看进程树 cat /etc/shells           #查看系统安装的所有shell解释器 yum -y install ksh  #安装新的解释器 一、shell脚本的结构 1、声明解释器 #!/bin/bash 2、注释脚本的…

[html] 怎样在文本框中禁用中文输入法?

[html] 怎样在文本框中禁用中文输入法&#xff1f; 用文本框的 ime-mode css 属性松开键时检查文本框的的值&#xff0c;只保留 Unicode 编码在 0 &#xff5e; 255 的字符把所有双字节字符替换为空把中文字符替换为空个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知…

SQLSERVER复制订阅中的数据库版本选择

设想一种场景&#xff1a; 两台发布SQL&#xff1a;数据库版本分别是SQL2005,SQL2008一台分发SQL: 数据库版本SQL2005一台订阅SQL: 版本待定 问 在这种情况下订阅服务器应该采用哪种版本的SQLSERVER? 2005还是2008&#xff1f; 这里假定一个前题&#xff1a;发布上的SQL2008并…

做系统ghost步骤图解_用好这工具,小孩都能会重装系统!

之前“事儿哥”曾给小伙伴们介绍过一款bios模拟器&#xff0c;(点击查看《比游戏模拟器罕见一百倍&#xff01;99%的人没见过&#xff01;真实用&#xff01;》)&#xff0c;让你可以轻松模拟操作bios&#xff0c;而不影响真实的电脑&#xff0c;不怕把电脑弄坏了&#xff01;今…

python一些方便excel行操作的函数(一)

import collections class headhandler():def __init__(self,mylist):self.mystorage{}self.mylist mylistdef delempty(self):去除重复:return:while "" in self.mylist:self.mylist.remove("")def formatmydata(self,i):try:ii.replace("&#xff…

nginx php空白页 fastcgi_param

原文地址&#xff1a;http://hi.baidu.com/%CA%E6%B7%F4%BC%D1%B2%C5%CA%C7%CD%F5%B5%C0/blog/item/77e622509c15dd06377abe4e.html 今天安装完nginx 后 发现html页面能正常浏览 但是php文件的页面打开后是一篇空白 看php-fpm日志 看nginx日志都没找到问题 上网搜索了半天终于解…