db2 sql分页查询,更酷的代价

十月 15th, 2009 发表评论 阅读评论

用db2进行分页查询比较麻烦,不像mysql那样增加一个limit start pageSize就可以了。
虽然,很多的编程语言的sql api都能够实现分页的功能,但总感觉用一条sql来进行分页查询是一件更酷的事情,因此找了些资料,能用一条sql就能查询出指定页的记录内容。原理就是在原有sql基础上增加一个表示行号的字段,外嵌一层sql来查询:
select * from ( select rownumber() over() as rownum, ### from ### where ### ) tempT
where rownum > ### and rownum <= ###

在网上很多网站都能找到上面这条语句,然而在很多情况下,查询出了指定页面的内容下,可能还要查询出总记录的条数,因此可能还有写一条语句来查询:
select count(*) from ( select rownumber() over() as rownum, ### from ### where ### ) tempT

但我就遇到了一个情况,在嵌套里面层的sql运行时间比较长,这样查询出指定页面的记录还要查一次count(*)就进行了2次查询,时间长啊。因此我想,如果一次查询就能查询出指定页面和总记录数就好了,也许能省些时间。

最后,经过我的尝试,可以这样解决:
with tempT as (
select rownumber() over() as rownum, ### from ### where ###
) select tempT.* from tempT where rownum > ### and rownum <= ###
 or rownum = ( select count(*) from tempT )
也就是在查询的时候,顺便把最后一行都查出来了,最后一行的rownum就是该sql查询结果的总数了。当然,查询结果就有可能比一个页面大小多了一条记录了,要在程序中判断,如果查询结果的记录数大于页面大小,就把最后一条记录删掉就行了。

现在就有3种方法来进行把sql的查询结果分页了:
1)用sql api,标准方法,通用,依赖api
2)用外嵌一层查询加一次count(*)查询
3)用with tempT as多查询一条记录,由程序处理
比较了一下时间,在我使用的一个测试例子里,方法1使用了2014ms,方法2使用了2235ms,方法3使用了2150ms,看来折腾了这么久,也没能节省时间,反而时间更长,不知道能不能省点内存,那样的话还有点安慰。看来,要写出更酷的代码,是要付出代价的,谁叫db2这么难搞呢,边个分页功能都没有。唉,突然觉得,我玩的不是sql。

分类: 技术笔记 标签: db2  数据库  sql  分页  (964次阅读)

  1. 2009-10-16 at 11:13
    DB2啊,你研究的东西真多。
    ps:代码用一些样式包起来比较直观,或者用插件。
  2. 2009-10-19 at 18:29
    刚知道db2是什么东西……自卑中……
  3. 2009-10-25 at 11:17
    还是mysql简单呀
  4. 2009-11-02 at 11:06
    大家都是Micolog,交换友情链接如何?你的已经添加,我的博客:Blog research 地址:http://blog-research.appspot.com/
  5. 2009-11-07 at 15:18
    博客是不错,可是空间已经到期一个多月了。
    现在正愁空间的问题呢。。。
  6. 2009-11-08 at 19:52
    我也收到这个测试ip了 速度还不错  但不知道能坚持多久! 墙让国外主机销售欣欣向荣呀!!
  7. 2010-05-18 at 22:50
    发生大