• 几种分页方法效率比较


    ASP.net 的DataGrid 控件的内置分页功能一直不被看好,原因是它先把所有数据从数据库读出来再进行分页。在数据量很大的情况下,用它内置的分页功能被认为几乎是不可能的事。对海量数据的读取和分页,大家会通过自定义分页来实现。其核心技术是SQL语句的设计。一般有三种方案:

    方案一:(利用SQL的游标存储过程分页)
    create procedure XiaoZhengGe
    @sqlstr nvarchar(4000), --查询字符串
    @currentpage int, --第N页
    @pagesize int --每页行数
    as
    set nocount on
    declare @P1 int, --P1是游标的id
    @rowcount int
    exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
    select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
    set @currentpage=(@currentpage-1)*@pagesize+1
    exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
    exec sp_cursorclose @P1
    set nocount off
    -------------------------------------
    方案二:(利用SELECT TOP和Not In分页)
    SELECT TOP 页大小 *
    FROM TestTable
    WHERE (ID NOT IN
    (SELECT TOP 页大小*页数 id
    FROM 表
    ORDER BY id))
    ORDER BY ID
    -------------------------------------
    分页方案三:(利用SELECT TOP和ID>MAX(id)分页)
    SELECT TOP 页大小 *
    FROM TestTable
    WHERE (ID >
    (SELECT MAX(id)
    FROM (SELECT TOP 页大小*页数 id
    FROM 表
    ORDER BY id) AS T))
    ORDER BY ID

    有网友通过SQL 查询分析器进行比较,得出结论:
    方案三(利用ID>MAX(id))效率最高;
    方案二(利用Not In) 效率次之;
    方案一(利用SQL的游标存储过程分页)最为通用,但效率最差。

    事实果真是这样吗?这三种方案就是比DataGrid 控件的内置分页功能好吗?我以前用Access做程序时发现Not in语句效率很低的呀?于是决定亲自试一试。

    装SQL有点麻烦,就用 Access 吧,方案一用存储过程分页没有试验。

    用Access新建一Book.mdb文件,打开后建一表mytable,加入五个字段:ID,name,author,islend,username。建好表后向内灌入一定数量的记录,以方案二、方案三和DataGrid 控件的内置分页功能分别写一个 .aspx 文件,同时写一 .asp 文件进行比较。

    测试条件:P4 2.4G,256MDDR,WindowsXP,IIS,每页20条记录。
    ID>MAX(id)语句:string sqlstr="Select Top "+PageSize+" * from mytable where(ID >(select MAX(ID) from(select top "+(PageSize*CurrentPage)+" ID from mytable order by ID asc))) order by ID asc";
    Not In语句:string sqlstr="Select Top "+PageSize+" * from mytable where ID not in(select top "+(PageSize*CurrentPage)+" ID from mytable order by ID asc) order by ID asc";

    运行结果如下:

    方案 记录条数及换页时间
    100万 276000 10万 1000
    ID>MAX(ID) 16秒 3秒 1秒 <1秒
    not in 未打开网页 未打开网页 未打开网页 >1秒
    DataGrid内置分页 未打开网页 23秒 5秒 <1秒
    asp分页 未打开网页 3秒 1秒 <1秒


    通过比较可见,DataGrid 控件的内置分页功能的确不怎么样,但比起一直比较流行的 Not in 语句分页是好多了,至少在20多万条记录的情况下能显示网页。 有人说asp.net 因为是编译执行,运行速度上比asp要快。通过测试没发现快多少。
    另:据说 DataList 控件比 DataGrid 控件数据显示性能方面要好一些,可能是真的。我对这两个控件也分别进行了测试,没感觉有多大差异,至少在27万条记录的情况下觉不出来。
    难道想象和现实之间的差距真的这么大吗?
    原文地址:http://blog.csdn.net/forevercyan/article/details/7475568

    本站注释:以上内容转载。但以上max方法分页有一个小弊端,始终无法查询第一页。当页数为1的时候查的是第二页,也页数为0的时候查询空白。网上很多方法说利用存储过程实现进行判断是否是第一页,如果是就分别使用不同的max查询语句。还有的说是使用编程语言判断,执行不同的Sql分页语句。其实不必如此,一句就可以搞定。无论是直接利用SQL还是加上存储过程。
    代码如下:
    select top pagesize * from tablename where id>=(select max(id) from (select top ((pageindex-1)*pagesize+1) id from tablename order by id ) as t) order by id

  • 相关阅读:
    C#验证码识别类网上摘抄的
    C#如何用WebClient动态提交文件至Web服务器和设定Http响应超时时间
    C#制作曲线图源码
    在PHP中怎样实现文件下载?
    ASP.NET如何调用Web Service
    MSDN中关于读取web.config的那块,System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString
    饿也要做一个和这个差不多的blog,但功能上有要增强的
    理解能力的高低决定人们的学习能力的高低
    有点困惑了,不知道是从smartClient入手还是从做网站web入手学习.net技术
    什么工厂模式?反射, 晕了,有书吗,推荐推荐.....5555555555555
  • 原文地址:https://www.cnblogs.com/laihuayan/p/2589861.html
Copyright © 2020-2023  润新知