MSSQL 2005 分页分析及优化(转)

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/yanbinboy/archive/2008/05/22/1204487.html

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

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

相关文章

python基础:python循环、三元运算、字典、文件操作

目录&#xff1a; python循环三元运算字符串字典文件操作基础 一、python编程 在面向过程式编程语言的执行流程中包含&#xff1a; 顺序执行 选择执行 循环执行 if是条件判断语句&#xff1b;if的执行流程属于选择执行&#xff1b;if语句有三种格式&#xff0c;如下&#xff1…

mybatis学习(23):分页1 多参数传递(索引方式)

分页排序 目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer id);Blog selectBlog2(Integer id);List<Blog> sele…

1.怎样定制VC#DataGrid列标题?

1.怎样定制VC#DataGrid列标题&#xff1f;DataGridTableStyle dgts new DataGridTableStyle(); dgts.MappingName "myTable"; //myTable为要载入数据的DataTableDataGridTextBoxColumn dgcs new DataGridTextBoxColumn(); dgcs.MappingName "title_id"…

[优先队列][堆] Luogu P4505 组合子逻辑

题目描述 组合子逻辑是 Moses Schnfinkel 和 Haskell Curry 发明的一种符号系统&#xff0c;用于消除数理逻辑中对于变量的需要。本题考察一种与真实世界的组合子演算略有差别的组合子系统。 一个组合子项是下列形式之一&#xff1a; PP (E_1\;E_2)(E1​E2​) 其中 PP 表示一个…

mybatis学习(24):分页2 多参数传递(使用注解)

分页排序 目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer id);Blog se…

Python -- 三元表达式(三目运算符)

一些语言&#xff08;如Java&#xff09;的三元表达式形如&#xff1a; [plain] view plaincopy 判定条件?为真时的结果:为假时的结果 Python的三元表达式有如下几种书写方法&#xff1a; [python] view plaincopy if __name__ __main__: a b True c …

网页广告代码

http://blog.tangcs.com/2009/03/03/web-page-ad-code/转载于:https://www.cnblogs.com/WarrenTang/archive/2009/03/03/1402521.html

Vista SP1、IIS7,安装ASP.Net 1.1、VS2003、NetAdvantage 2004vol、Sql Server2000全攻略

对于微软的软件&#xff0c;一向认为是&#xff1a;beta版惨不忍睹&#xff0c;rtm版马马虎虎&#xff0c;sp1版。所以&#xff0c;现在Vista SP1出来了&#xff0c;我也考虑更换操作系统了。经过一番google&#xff0c;唯一的问题应该就在于ASP.Net 1.1在Vista上的运行调试了&…

mybatis学习(25):分页3 多参数传递(使用map)

分页排序 目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBl…

2019CCPC湖南全国邀请赛-Chika and Friendly Pairs- 莫队+树状数组+离散化

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid6534 思路&#xff1a; 莫队算法&#xff0c;树状数组求和。每个数对应的离散化之后的值需要打表存下来。 Code&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 const int N2700010;4 int…

用 GDI 操作 EMF 文件[6]: GetEnhMetaFileHeader - 获取 EMF 的头文件

//增强图元文件的头文件结构 TEnhMetaHeader: tagENHMETAHEADER packed recordiType: DWORD; {记录类型}nSize: DWORD; {结构大小}rclBounds: TRect; {外接矩形(单位是像素)}rclFrame: TRect; {图片矩形(单位是 0.1 毫米)}dSignature: DWORD; …

mybatis学习(26):插入功能(插入数据)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

[Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例.

今天 不知自己装的centos 出现了什么问题, 一直卡在 启动界面, 找了半天没找见原因(最后时刻还是发现原因, 只因自己手欠一怒之下将centos删除了, 而且选择的是在本地磁盘也删除. ..让我哭一会..).. 于是便重新安装, 可是问题来了, 之前安装及配置好的zookeeper/redis/solr/tom…

Linux服务之nginx服务篇一(概念)

nginx官网&#xff1a;http://nginx.org/ 一、 nginx和apache的区别 Nginx&#xff1a; 1、轻量级&#xff0c;采用 C 进行编写&#xff0c;同样的 web 服务&#xff0c;会占用更少的内存及资源。 2、抗并发&#xff0c;nginx 以 epoll and kqueue 作为开发模型&#xff0c;处理…

基于Response的将数据导出到Excel

众所周知&#xff0c;Respone.Write()是输出Html流程序给用户的。考虑到一个标准的Web页面的是有多种呈现方式的&#xff0c; 例如:<meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> 这是以标准网页形式输出Html流 <meta htt…

mybatis学习(27):获取自增id方式一(在mapper中insert配置节点的属性)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

Linux下redis的安装及配置.

在上一篇[Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例. 我们已经将redis所需tar包拷贝到了linux下的root 根目录下, 接着我们只需要解压就可以了. 先将Redis的tar包拷贝到Linux下的根目录 然后解压到redis文件夹下:(先使用mkdir创建redis文件夹…

实战演习-用wse上传下载文件

jillzhang jillzhang126.com 这几天&#xff0c;光忙着写程序员职场了&#xff0c;对wse的翻译和学习没有太大的进展&#xff0c;这可不太好&#xff0c;毕竟咱还是靠技术混饭吃的&#xff0c;荒废了技术怎么行&#xff01;今天再上一盘有关wse的小菜&#xff0c;目的是想用ws…

mybatis学习(28):获取自增id方式二(在全局中配置setting选项)

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

推荐一篇讲解各种debug技术的文章,相当不错!

讲述debug的各种工具和技巧的文章&#xff0c;相当不错 &#xff01; http://blog.csdn.net/agan4014/archive/2008/03/20/2199790.aspx 转载于:https://www.cnblogs.com/Winston/archive/2008/06/12/1218427.html