zoukankan      html  css  js  c++  java
  • 分页那回事

     

    分页是在做b/s开发当中比较常见的。SQL 2005 当中有了ROW_NUMBER 函数,使分页变的异常简单。同时它自动进行了优化相比较其他几种方法,速度是比较快的。

    分页大体需要3个参数 pagesize(每页显示多少)pagenum(页数) pagecount(总记录数)。

    分页SQL 2000可以用临时表 top 语句 ,游标 等等都可以实现。我们可以测试下

    只写出临时表的

    测试表如下 主键ID name 测试数据10w

    create table sample

    ( id int identity primary key,

     name varchar(8) not null

    )

    declare @n int ,@t datetime

    set @n=1

    set @t=getdate()

    while @n<=100000

    begin

    insert into sample(name)

    select 'a'+cast(@n as varchar)

    set @n=@n+1

    end

    select datediff(ms,@t,getdate())

    本文@pagesize都是从0开始的表示第一页

    临时表如下实现分页存储过程如下::

    create proc [dbo].[pages]

    (

    @pagesize int ,

    @pagenum int ,

    @pagecount int output

    )

    as

    dbcc dropcleanbuffers --从缓存中清除数据

    dbcc freeproccache--清空执行计划

    declare @t datetime

    set @t=getdate()

    declare @table table(tID int identity,SID int)

    insert into @table (SID)

    select id from sample

    select @pagecount=count(*) from @table

    select a.* from

    sample a,@table b

    where a.id=b.sid and tid>@pagesize*@pagenum and tid<=(@pagesize+1)*@pagenum

    select datediff(ms,@t,getdate())

    测试数据为 @pagesize=2 @pagenum=20 总记录数为10w 大体时间为900ms左右 ,不同的电脑数据会有差别,但跟用row_number() 比较还是明显比较大的。

    row_number() 实现分页存储过程如下:

     

    create proc [dbo].[pages_1]

    (

    @pagesize int ,

    @pagenum int ,

    @pagecount int output

    )

    as

    dbcc dropcleanbuffers --从缓存中清除数据

    dbcc freeproccache--清空执行计划

    declare @t datetime

    set @t=getdate()

    with temp as(

    select * ,row_number() over(order by id)as num

    from sample

    )

    select @pagecount= count(*) from temp;

    with temp as(

    select * ,row_number() over(order by id)as num

    from sample

    )

    select * from temp

    where num between @pagesize*@pagenum+1 and (@pagesize+1)*@pagenum;

    select datediff(ms,@t,getdate())

    测试数据为 @pagesize=2 @pagenum=20 总记录数为10w 大体时间为200ms左右 区别还是比较大的 比上面一种快5倍。


    作 者:清水无鱼
    出 处:http://www.cnblogs.com/wzpo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面 明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Windows和linux(ubuntu)互传文件简便快捷的方法
    Monkey与MonkeyRunner之间的区别
    Monkeyrunner 简介及其环境搭建
    如何查看Android apk的包名?
    Android自动化测试如何获取坐标点?
    android自动化测试之Monkey--从参数讲解、脚本制作到实战技巧
    Docker 命令
    在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件。
    CentOS7中使用iptables
    centos7下找不到iptables文件
  • 原文地址:https://www.cnblogs.com/wzpo/p/1738618.html
Copyright © 2011-2022 走看看