当前位置: 网学 > 编程文档 > SQL SERVER > 正文

MS SQL2005 分页分析及优化

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/19
下载{$ArticleTitle}原创论文样式

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

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

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

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

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

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

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

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

    分页情况分析:
     
  • @AbsolutePage==1
  • @AbsolutePage<@PageCount/2
  • @AbsolutePage>=@PageCount/2
  • @AbsolutePage==@PageCount情况1:
    请求页等于第一页,这种情况是最简单的.复制内容到剪贴板
    代码:
    SelectTOP@PageSize*From[Paing_New]OrderBYIDDesc 情况2:
    请求页小于总页数/2复制内容到剪贴板
    代码:

    WITHCTEAS
    (
    SELECTTOP@AbsolutePage*@PageSize
    *
    ROW_NUMBER()Over(OrderByIDDesc)as_RowNumber
    FROM[Paing_New]
    )
    SELECT
    *
    FROMCTE
    WHERE_RowNumber>(@AbsolutePage-1)*@PageSize); 情况3:
    请求页大于等于总页数/2
    理论上请求页等于总页数/2的时候应该也有优化方法.复制内容到剪贴板
    代码:

    WITHCTEAS
    (
    SELECTTOP@RecordCount-(@AbsolutePage-1)*@PageSize
    *,
    ROW_NUMBER()Over(OrderBYIDAsc)as_RowNumber
    FROM[Paing_New]
    )
    SELECT
    *
    FROMCTE
    WHERE_RowNumber>(@RecordCount-@AbsolutePage*@PageSize)OrderBYIDDesc; 情况4:
    请求页等于总页数复制内容到剪贴板
    代码:

    WITHCTEAS
    (
    SELECTTOP@RecordCount-(@AbsolutePage-1)*@PageSize
    *,
    ROW_NUMBER()Over(OrderBYIDAsc)as_RowNumber
    FROM[Paing_New]
    )
    SELECT
    *
    FROMCTEOrderBYIDDesc; 数据测试结果:
    第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的方式比较好.
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号