DB2的分页高效率实现总结
来源:互联网 发布:网络教育有用吗 编辑:程序博客网 时间:2024/04/25 09:09
最近在做一个DB2的项目,遇到分页处理的设计时开始犯难。以前一直采用MySQL作为项目数据库,其中的Limit关键字非常人性化,MySQL把分页的处理逻辑封装到了数据库的核心中,使得做查询设计时,根本不用过多的考虑分页的问题。
可是DB2却把这个难题推到了我们面前。其实不止DB2如此,很多大型的数据库例如MS SQL Server也不支持分页关键字。当然,DB2中提供了RowNumber函数,同Oracle有一些类似。有很多解决方案都是由此关键字得来的。
为了解决这个问题,互联网上提供了如下几个解决方案:
方案一:利用JDBC2的数据集。JDBC2数据集中提供了absolute方法,用来在查询的结果集中进行定位,数据集保存在内存中,你必须告诉JDBC你想定位的绝对位置,这个位置由你来计算。对于海量的数据集,这种方式效率并不高。
方案二:利用DB2自带的函数 ROWNUMBER() OVER(ORDER BY sort-key),这里的RowNumber函数是通过排序计算出来的行的顺序号。根据这个原理,可以先SELECT满足WHERE条件的所有记录,然后用ORDER BY排序,在行号的基础上,结合子查询的组合得出查询结果。例如:
select * from ( select rownumber() over(order by foo.bar, foo.baz) as rownumber_, * from foos foo order by foo.bar, foo.baz ) as temp_ where rownumber_ between ?+1 and ?
方案三:这个解决方案准确的说是从MSSQL阵营中获得的。参考以下链接:http://dev.csdn.net/author/mengyao/f78b60685f5b483ba459f4962fab6774.html。早先有人给出了如何从数据库中取出从M到N的记录的解决方案,后来有人写成了存储过程,并不断得到改进和优化。我很欣赏这种不断钻研的精神,只有这样技术才能不断的得到进步。
第三种方案的实现原理其实很简单。先用一个子查询从数据库中选出(Page-1)*PageSize个记录来,然后用max/min关键字(更加排序的方式)取出子查询中的最大或最小值。外查询再取出所有满足大于/小于这个值的前PageSize个记录。就这么简洁。
早一些的实现使用了NOT IN/NOT EXIST等关键字,后来被MAX/MIN方案所取缔,主要是考虑到效率问题。实现者表现出了对于数据库的精湛技术的同时,也为我们提供了一个优雅的解决方案。
方案比较:
三种方案各有所长。
第一种方案可以算得上是一种独立的解决方案,不需要任何特殊的数据库技术支持,只要使用JDBC2.0就可以。但在处理大规模的数据查询时,需要耗费大量的数据库游标移动所带来的性能损耗。
第二种方案是DB2和Oracle采用的解决方案,相比前一种,性能上要好很多。但同第一种相类似,仍然要把所有满足条件的记录放到内存中,通过内部的游标查询来实现分页。在特定于数据库的方案中,这种方案是一种可取的方案。另外,在对分组查询(Group BY)进行分组时,如果采用第三种方案,每一次分页都将会进行两次分组查询,非常的低效,这个时候,采用第一、二中方案就比较理想。
第三种方案是我比较欣赏的风格:优雅。之所以这么说,是因为该方案封装在存储过程中,利用了存储过程编译后运行的高效性;同时方案本身采用了优雅的通用数据库技术,通用性和效率都能得到保证。
具体采用什么样的方案,一般应该根据自己的项目实际情况来定。如果数据量比较小,建议采用第一种方案;如果数据量中等,采用第二种;反之,第三种是在处理大容量数据分页查询下的理想方案。
- DB2的分页高效率实现总结
- sqlserver高效率分页实现
- 高效率的分页存储过程
- DB2实现分页
- DB2 的分页
- db2分页的sql
- 一个高效率的ASP分页算法
- 一个高效率的SQL Server分页语句
- Repeater和ListView的高效率分页
- 一个高效率的分页存储过程
- DB2中如何实现分页
- [笔记]Oracle、MySQL和DB2数据库分页查询的实现
- mysql分页原理和高效率的mysql分页查询语句
- mysql分页原理和高效率的mysql分页查询语句
- mysql分页原理和高效率的mysql分页查询语句
- mysql分页原理和高效率的mysql分页查询语句
- mysql分页原理和高效率的mysql分页查询语句
- mysql分页原理和高效率的mysql分页查询语句
- BPEL简介 An Introduction to BPEL
- IE不能主动识别UTF-8编码的问题
- UTF-8 字符处理在 Web 开发中的应用
- JNLP介绍
- GB/BIG5/UTF-8 文件编码批量转换程序
- DB2的分页高效率实现总结
- IE中bordercolorlight的CSS实现
- Flex 基础
- 企业集成与 Web Services 和 BPEL
- 网页设计技巧类网站收集
- 怎样提高你的Google Adsense收入
- 获取页面高度,窗口高度,滚动条高度等参数值
- Linux系统环境下的Socket编程详细解析 (3)
- Web打印的实现方法