分页解决方案 之 分页算法——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 的区别。
分页解决方案 之 分页算法——Pager_SQL的思路和使用方法相关推荐
- 分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库
这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据.显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加.修改.删除数据后如何更新 ...
- [BS-28] iOS中分页的几种算法
iOS中分页的几种算法 总记录数:totalRecord 每页最大记录数:maxResult 算法一: totalPage = totalRecord % maxResult == 0 ? total ...
- 分享一个完整的Mybatis分页解决方案
分享一个完整的Mybatis分页解决方案 参考文章: (1)分享一个完整的Mybatis分页解决方案 (2)https://www.cnblogs.com/gev-1016/p/6606114.htm ...
- Elasticsearch分页解决方案
Elasticsearch分页解决方案 参考文章: (1)Elasticsearch分页解决方案 (2)https://www.cnblogs.com/yfb918/p/11023581.html 备 ...
- java miniui datagrid_miniui datagrid 的客户端分页解决方案
官方的解决方案 官方在"在线示例"中给了一个简单的 client pagination 解决方案,代码就不贴了,这里说说它的基本思想和处理过程. 首先,是绑定一个 preload ...
- Elasticsearch分页解决方案研究
目录 一.命令方式做分页 1.1 常见的分页方式:from+size 1.2 scroll方式 1.3 search_after 的方式 二.java api做elasticsearch分页 2.1 ...
- Java架构直通车——ElasticSearch深度分页解决方案
文章目录 分页查询 深度分页 深度分页解决方案 分页查询 分页查询是这样的: POST /shop/_doc/_search {"query": {"match_all& ...
- Vue3 element-ui实现Pagination分页组件--封装分页
什么是Pagination分页组件? 在 B 端的 web 开发中,分页组件或者叫分页器,是较为常用的控件之一,通常配合表格或列表,实现数据量大的情况下,分页拆解数据的功能. 1.scrollTo和滚 ...
- java 通用内存分页(List分页)
自己编写相关工具类 List分页和SQL分页在什么情况下使用? 参考URL: https://www.zhihu.com/question/62593358/answer/1126234241 Jav ...
- ajax 分页 php,phpajax分页一_PHP教程
ajax分页 php ajax 分页 java ajax分页 asp.net ajax分页 jquery ajax 分页 jsp ajax无刷新分页 asp ajax分页 ajax 分页问题 ajax ...
最新文章
- linux 解压缩常用命令
- C# 获取FormData数据
- 在Visual Studio Code里进行Java开发
- IOS 企业版发布后,用户通过sarafi浏览器安装无效的解决方案
- Spark之scala学习(基础篇)待更新
- Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)
- 【英语学习】【Level 08】U03 My Choice L4 The coolest movie character
- 解决maven加载不了oracle jdbc驱动包的问题
- python连接数据库设置编码_python操作mysql中文显示乱码的解决方法
- git submodule子模块管理
- 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)
- 3.SpringBoot 常用配置
- Eclipse PHPEclipse 配置
- 淘宝运营到底是做什么的?
- npm install xxxx --legacy-peer-deps命令是什么?
- Sketchfab模型在ThingJS上的应用
- 一个数的所有连续自然数之和
- Java程序员月薪达到三万,需要技术水平达到什么程度?(转)
- Yii框架里的一些zii用法
- Mac苹果系列的安全基线(包括主机和操作系统等)+checklist
热门文章
- 计算机专硕超过270分人数,从18调剂看19备考策略(附76所院校19招生简章)
- 恒压板框过滤实验数据处理_中学少见、高考常考的化学实验仪器
- 下列哪种不是python元组的定义方式_python笔试题
- python个人所得税怎么写_Python实现的个人所得税计算器示例
- DRUID连接池:java.sql.SQLRecoverableException: 关闭的语句
- Jmeter中获取返回结果中的值
- django 使用新的虚拟环境
- django基础-学生管理系统
- Python字典对象实现原理
- [翻译] SSKeychain