分页解决方案 之 分页算法——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 的区别。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逢魔安全实验室

SQL注入ByPass的一些小技巧

? 01 — 前言 SQL注入从古至今都是一个经久不衰的影响严重的高危漏洞,但是网络安全发展到现在,如果想通过SQL注入直接获取数据或者权限,多多少少都需要绕...

42990
来自专栏Java3y

移动商城第四篇(商品管理)【添加商品续篇、商品审核和上下架、前台展示、后台筛选】

属性选项卡 第三个选项卡涉及到了我们的手机属性,因此,还是需要用到我们其他的数据库表:EB_FEATURE 继续做逆向工程: ? 这里写图片描述 查询出普通属性...

1.1K90
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十八天 管家婆家庭记账软件【悟空教程】

本项目为JAVAEE基础班综合项目,包含了若干个知识点,达到将基础班所学知识综合使用,提高了我们对项目的理解与知识点的运用。

33450
来自专栏深度学习之tensorflow实战篇

mongodb11天之屠龙宝刀(四)高级查询:MongoDB内嵌字段查询

mongodb11天之获取屠龙宝刀(四)高级查询:MongoDB内嵌字段查询 实战环境 IDE:nosql manager for mongodb 表...

32240
来自专栏烙馅饼喽的技术分享

本人有生以来的第一篇博客,嘿嘿,就发这个吧, 怎样在虚拟主机上使用Castle框架的ActiveRecord

        我在某个私人项目中使用了Castle 的 ActiveRecord.用起来那是真叫个爽,整个项目里楞是一句SQL语句都没有,嘿嘿。超级喜欢上了这...

27850
来自专栏菩提树下的杨过

velocity模板引擎学习(1)

velocity与freemaker、jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVeloc...

22950
来自专栏更流畅、简洁的软件开发方式

【测试】两种数据库,四种分页算法的效率比较

分页算法本身没有什么快慢之分,对反应速度起到决定作用的是——能否有效地利用索引! 算法 评价 缺点 适用的数据库 max 效率最高的 只能有一...

31570
来自专栏挖掘大数据

整合Kafka到spark-streaming实例

在这篇文章里,我们模拟了一个场景,实时分析订单数据,统计实时收益。

2.4K90
来自专栏扎心了老铁

spark-streaming集成Kafka处理实时数据

在这篇文章里,我们模拟了一个场景,实时分析订单数据,统计实时收益。 场景模拟 我试图覆盖工程上最为常用的一个场景: 1)首先,向Kafka里实时的写入订单数据,...

83850
来自专栏架构之路

Hive简介

转载自http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html Hive简介   首...

38230

扫码关注云+社区

领取腾讯云代金券