我的pager_sql完成了,就是专门对付分页算法(分页用的SQL语句的),要不要合作一下?

自然框架 2009-05-15 07:55:03
http://www.cnblogs.com/jyk/archive/2009/05/15/1457211.html

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



...全文
208 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wklilong 2009-06-25
  • 打赏
  • 举报
回复
up
分页写好了 真是个好东西
海量数据 很多都是对付这过的
自然框架 2009-06-25
  • 打赏
  • 举报
回复
up
我姓区不姓区 2009-05-19
  • 打赏
  • 举报
回复
图文并茂,还有测试报告,赞
自然框架 2009-05-19
  • 打赏
  • 举报
回复
吴旗娃老大呢?
自然框架 2009-05-16
  • 打赏
  • 举报
回复
吴旗娃老大呢?
wuyq11 2009-05-15
  • 打赏
  • 举报
回复
不错,顶
qq6212639 2009-05-15
  • 打赏
  • 举报
回复
好帖 顶起 !
wangchao813 2009-05-15
  • 打赏
  • 举报
回复
学习
自然框架 2009-05-15
  • 打赏
  • 举报
回复
谢谢。
pdsnet 2009-05-15
  • 打赏
  • 举报
回复
鼓掌
自然框架 2009-05-15
  • 打赏
  • 举报
回复
后面还有效率的测试报告。
sxmonsy 2009-05-15
  • 打赏
  • 举报
回复
这个快吗
自然框架 2009-05-15
  • 打赏
  • 举报
回复
1、多表关联的可是使用视图,也可以拼接,但是颠倒Top的是不行了,Row_Number的应该可以,还没具体测试。我是一直使用视图来着。

2、查询分页的话,可以设置查询条件,这个查询条件也是一个属性,和表名、字段名是一个级别的,改变查询条件,只是改一个属性值。

3、mysql的可以增加一个limit的子类,在这个子类里面拼接mysql需要的sql语句。
shalenykj 2009-05-15
  • 打赏
  • 举报
回复
不知道mysql能用么
gongsun 2009-05-15
  • 打赏
  • 举报
回复
呵呵...
wxg22526451 2009-05-15
  • 打赏
  • 举报
回复
up
sucong 2009-05-15
  • 打赏
  • 举报
回复
学习。顶
RHCL 2009-05-15
  • 打赏
  • 举报
回复
mark
zzxap 2009-05-15
  • 打赏
  • 举报
回复
如果查询分页,如果那么多方案,估计代码要写N多
zzxap 2009-05-15
  • 打赏
  • 举报
回复
自己写,想怎样分就怎样分
加载更多回复(7)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧