db2 sql分页查询,更酷的代价
用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。
ps:代码用一些样式包起来比较直观,或者用插件。
现在正愁空间的问题呢。。。