集智平台有关分页的那些事
在使用报表的时候,会经常接触与“分页”相关的问题,如报表分页和分页取数,为避免在与客户交流时双方就分页问题产生分歧,下面就分页问题做个简单说明。
首先是报表页面结果分页,这个就是润乾报表在浏览器上查看时的分页效果,这种方式对于未分页形式在页面载入时会快一些,但方法自身没有什么优化(润乾报表是这样,其它web报表工具也这样)。
其次是服务器数据分页,这是润乾特有的exthtml标签的作用,一般来说如果服务器给力,几十万的数据量使用exthtml都可以达成满意的查询速度,对于exthtml的使用,下面举例说明:
<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<html>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<report:extHtml totalCountExp=”query(’SELECT count(*) FROM test’)”
name=”report1″
reportFileName=”/testExt.raq”
pageCount=”50″
cachePageNum=”2″/>
</body>
</html>
totalCountExp,pageCount,cachePageNum是三个分之所以页必填参数,总行数,每页行数,多少页,该标签作用是全部取出数据,然后在内存的数据中进行分页定位,之所以能够节省时间,是因为做到了分块取数分块运算和展示,其重点在于,从数据库取出来的数是很小的,一旦在内存中把表格对象化以后,每个单元格的大小是0.7K,使用这个标签可以避免在内存中处理海量数据的时候一次性初始化所有单元格。
最后是数据库分页取数,该方法是在sql取数时通过参数实现分段取数,也是报表显示真实大数据量的唯一可行办法
大数据量:1000w? TB存储量级的数据?
真的需要在报表上显示这么多的数据么?
实在不能通过中间表技术用空间换时间么?
如果上面三个问题都是肯定的答复,好!那么向下看吧。
首先介绍看一下oracle分页实现技术:
方法1.利用分析函数
row_number() over ( partition by col1 order by col2 )
比如想取出100-150条记录,按照tname排序
select tname,tabtype from (
select tname,tabtype,row_number() over ( order by tname ) rn from tab
)
where rn between 100 and 150;
方法2. 直接使用rownum 虚列
select tname,tabtype from (
select tname,tabtype,rownum rn from tab where rownum <= 150
)
where rn >= 100;
使用虚列不能基于整个记录集合进行排序,如果指定了order by子句,排序的的是选出来的记录集的排序.
了解了上述内容,剩下的就是如何结合润乾的宏/参数技术来生成动态的sql语句,至于参数是要传递起始行和截至行,还是传递起始行和每页行数,这要看具体的设计,但是作为润乾公司给出的可行性介绍,上面的内容足够具体了。