分页解决方案 之 分页算法——Pager_SQL的思路和使用方法

      分页算法(也就是分页读取数据的时候使用的select 语句)面临两大难题:一个是不同的数据库使用的分页算法是不一样的(比如SQL Server 2000可以使用Max、表变量、颠倒Top,SQL Server 2005可以使用Row_Number,MySql可以使用limit ,Orcale可以使用ROWNUM等);另一个是,不同的分页需求,可以采用的分页算法也是不一样的(比如单字段排序和多字段排序)。那么我们应该如何来选择呢?

      好多人都想找到一种即通用,效率又高的分页算法,那么能不能找到呢?我是找了很久都没有找到,看了许多人写得文章,我也没有发现(请不要和我说那个什么表变量的)。既然找不到,那就要做多手准备了。

      我的想法就是准备多种分页算法的“模板”,然后根据数据库的种类,根据分页需求来选择到底是用哪一种分页算法。就是说使用哪一种是不固定的,依据条件而定。那么如何来实现呢?我做了一个类库来做这个事情,请看下面的图示:
 
 

 

 

 

      Pager_SQL原来是QuickPager分页控件的一部分,现在独立出来可以单独使用。

      Pager_SQL就好像一个加工厂,给他输入“原料”(表名、字段名、排序字段等),然后再选择“加工方式”(选择分页算法),最后我们就可以得到所需的“产品”(分页用的select 语句)了。

      因为不管是什么数据库(只要是关系型数据库),那么就会有表、字段、视图,要分页就要有排序字段等,所以呢这些原料都是固定的,变化的只是分页用的SQL语句,这个Pager_SQL就是“生产”各种SQL语句的工厂。这样不同的分页算法既可以适应不同的数据库,也可以使用不同的分页需求。

      Pager_SQL的原理很简单,就是拼接字符串(也就是拼接SQL语句),然后通过数据访问函数库(或者其他的help等)提交给数据库执行。采用了基类的方式,所以如果需要增加分页算法的话,那么只要继承这个基类写一个子类,如果有不同的地方,覆盖一下就可以了。下面是类图:

 

 

      说到这里,您可能会有两个疑问:1、拼接字符串的效率是不是会很慢?2、SQL语句和储存过程相比是不是很慢?两个“慢”加起来,是不是变成了“巨慢”。一开始我也是比较担心,但是用了五年多,也用100万条记录做过测试,效率还是很理想的。这两天我又详细的测试了一下,在测试的过程中也发现了不少细节问题,以前忽略的地方,由于测试的比较乱,所以我想整理一下然后再写出来。

 

使用方法:

 

//实例化
JYK.Controls.Pager.QuickPagerSQL PagerSQL = new QuickPagerSQL();

protected void Page_Load(object sender, EventArgs e)
        {
            //设置属性
            PagerSQL.TableName = "News_NewsInfo";          //表名或者视图名称
            PagerSQL.TableShowColumns = "*";               //需要显示的字段
            PagerSQL.TableIDColumn = "NewsID";             //主键名称,不支持复合主键
            PagerSQL.TableOrderByColumns = "NewsID";       //排序字段,根据分页算法而定,可以支持多个排序字段
            PagerSQL.TableQuery = "";                      //查询条件

            PagerSQL.PageSize = 4;                         //一页显示的记录数

            PagerSQL.PageCount = 100;
            PagerSQL.ComputePageCount(100,4);

        }

        测试拼接字符串的效率#region 测试拼接字符串的效率
        protected void Btn_Satart_Click(object sender, EventArgs e)
        {
            //测试拼接字符串的效率
            //选择一个分页算法
            PagerSQL.SetPagerSQLKind = PagerSQLKind.MaxMin;
            //生成分页算法
            PagerSQL.CreateSQL();
            Response.Write( "检查生成的SQL语句:" + PagerSQL.GetSQLByPageIndex(2) + "<BR>");               //测试用,显示第二页的分页算法

            //开始计时,记录循环一万次的时间
            int a = Environment.TickCount;
            for (int i = 0; i < 10000; i++)
            {
                PagerSQL.CreateSQL();
            }

            int b = Environment.TickCount - a;

            Response.Write("循环10000次用时:");
            Response.Write(b + "毫秒<BR>");

        }
        #endregion

 

 

源码下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html

ps:下一篇里我会测试程序里面拼接字符串的时间、SQL Server2000分析、制作执行计划的时间,SQL语句和储存过程的对比,exe (@sql)和 exec sp_executesql @sql 的区别。

 

 

时间: 2024-10-26 05:06:58

分页解决方案 之 分页算法——Pager_SQL的思路和使用方法的相关文章

分页解决方案之分页算法——Pager_SQL的思路和使用方法

分页算法(也就是分页读取数据的时候使用的select 语句)面临两大难题:一个是不同的数据库使用的分页算法是不一样的(比如SQL Server 2000可以使用Max.表变量.颠倒Top,SQL Server 2005可以使用Row_Number,MySql可以使用limit ,Orcale可以使用ROWNUM等):另一个是,不同的分页需求,可以采用的分页算法也是不一样的(比如单字段排序和多字段排序).那么我们应该如何来选择呢? 好多人都想找到一种即通用,效率又高的分页算法,那么能不能找到呢?我

分页解决方案之分页算法——Pager_SQL的详细使用方法和注意事项

上一次有点匆忙,如何使用介绍的不是太清楚,而且这两天有改掉了几个bug,所以这次呢详细说一下,然后更新一下代码和demo. 源代码和demo的下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html JYK.Controls.Pager.QuickPagerSQL PagerSQL = new QuickPagerSQL(); //设置保存属性的位置.可以不保存,也可以保存在隐藏域.Cookie.Session等地方.默认保存在隐

分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项

        上一次有点匆忙,如何使用介绍的不是太清楚,而且这两天有改掉了几个bug,所以这次呢详细说一下,然后更新一下代码和demo.       源代码和demo的下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html                      JYK.Controls.Pager.QuickPagerSQL PagerSQL = new QuickPagerSQL();            //设置保存

分页解决方案 之 数据访问函数库——另类的思路、另类的写法,造就了不一样的发展道路。

      上一篇:分页解决方案 -- GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库         如何访问数据库?一个老掉牙的问题,方法多了去了,什么直接使用ado.net.使用SQLHelp.使用微软的企业库.使用ORM.使用LinQ to SQL等等,还可以使用自己封装的函数库,这里我就想说一下我的数据访问函数库的使用方法.       您可能会说了,这么简单的东东还用说吗,重复制作轮子有意义吗?这个嘛,

分页解决方案之GridView+QuickPager+QuickPager_SQL+DataAccessLibrary+数据

分页解决方案之GridView+QuickPager+QuickPager_SQL+DataAccessLibrary+数据库 这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据.显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加.修改.删除数据后如何更新,如何查询数据等等.一整套完整的解决方案. 这个方案要有几个特点: 1.支持多种数据库,可以提供多个分页算法以便于支持多种数据库. 2.可以在不同的要求下选用最优的分页算法

分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库

      这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据.显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加.修改.删除数据后如何更新,如何查询数据等等.一整套完整的解决方案.       这个方案要有几个特点:       1.支持多种数据库,可以提供多个分页算法以便于支持多种数据库.       2.可以在不同的要求下选用最优的分页算法.比如如果只需要按照主键排序,那么选择Max分页算法无疑是最快的一种分页算法.

分页解决方案 之 QuickPager的使用方法(目录)

        QuickPager asp.net 2.0 分页控件,基本告一段落.现在把使用方法.源码.Demo公布一下,感兴趣的可以下载看看.       一.从提取数据的角度开看,可以分为"自动"和"自定义"两种.       "自动"就是分页控件内部利用Pager_SQL和DataAccessLibrary,"自动"获取数据,然后绑定到显示数据的控件.而且可以自动处理分页产生的事件.就是说用了"自动&quo

miniui datagrid的客户端分页解决方案

官方的解决方案 官方在"在线示例"中给了一个简单的 client pagination 解决方案,代码就不贴了,这里说说它的基本思想和处理过程. 首先,是绑定一个 preload 事件,在这个事情中设置 event.cancel = true,阻止 datagrid 在翻页的时候向服务器请求加载数据. 那么数据从哪来呢?当然只有在外部写一个 ajax 过程获取了.不过取得的数据并不直接交给 datagrid,而是缓存起来,放在dataResult 中. 现在继续说 preload,除了

java web 分页解决方案

web开发中经常需要用到分页,我然来的做法是每次需要分页时都把代码copy一份,比如有10个页面有分页,那么我分页的代码就有10个版本.这样导致代码的重用性太低了. 那么如何解决呢? 把分页的页面和逻辑抽取出来,提高代码质量和重用性. (1)分页的页面抽取出来 Java代码   <%@ page language="java" contentType="text/html; charset=UTF-8"       pageEncoding="UTF