灵活应用多数据集
网格式、分组式、交叉式尽量用单数据集
看如下的报表:
这是一个比较典型的多层交叉报表,其做法有两种:
第一种:
这种做法设计了五个数据集,每一层的表头都来自一个码表,交叉点的数据汇总时根据条件和表头关联
第二种:
这种做法只设计了一个数据集,把码表和事实记录表叉乘起来,在报表中进行分组扩展 我们试比较一下两种做法的优缺点:
第一种做法:
1、 数据集不需要对多表进行叉乘,取数速度快
2、 事实记录数据集可以在sql里先进行分组聚集操作,减少取过来的记录书,加快取数的速度和报表运算速度
3、 表头扩展直接对码表进行select操作,运算速度快
4、 交叉点汇总需要对事实记录表进行检索遍历,查找出和表头关联的记录进行汇总,交叉点的格子数远远大于表头单元格的个数,事实记录表的记录数也一般远远大于码表的记录数,每个交叉点都要对事实记录表遍历检索一次,运算速度非常慢
第二种做法:
1、 数据集需要对码表和事实记录表进行叉乘,取数速度慢,但是一般情况下码表的字段数只有一两个,而且数据库有索引,记录数不是非常大的情况下慢不了很多
2、 在数据集sql里就可以对表头字段先进行分组聚集,这样取过来的记录数大大减少,加快了取数速度和报表的运算速度
3、 表头单元格是对事实记录表进行分组操作,然后再扩展,比第一种做法慢一些,但是由于对数据集只要进行一次的分组操作,因此慢不了太多
4、 交叉点汇总不需要再对事实记录表进行检索遍历了,而是直接对当前组集里的记录进行汇总,因此速度大大提高了
总结:第二种的做法性能优于第一种
多源分片、主子报表尽量用多数据集
看如下报表: .
这是一个比较典型的主子报表,主表一条记录对应子表多条记录,是个典型的一对多的关系,再引伸一下,一个主表可以对应多个子表,每个子表都是多条记录。 此时做法还是存在两种:
第一种:
1、 每个主表和子表分别定义一个数据集,在报表里通过条件把子表和主表关联起来
2、 优点:避免了表间叉乘,减少了数据量,加快了取数速度和数据库的运算速度。
3、 原因:对于主子报表,主表的字段数一般比较多,而子表一般有多条记录和主表的一条记录关联,同时子表间往往没有关联关系,因此如果叉乘会导致数据量大大增加,在多子表的情况下这个现象尤其明显
4、 缺点:子表取数扩展时,需要根据条件和主表记录关联,需要对子表记录进行遍历检索,但是大部分的情况下,主表只有一条记录或者只有十几条记录,因此对子表的遍历检索次数不会很多
第二种:
1、 只定义一个数据集,把主表和所有子表叉乘起来
2、 缺点:由于子表之间没有关联关系,且主表的字段数比较多,叉乘往往导致记录数呈几何级数增加
3、 优点:子表取数扩展时,不需要对子表记录进行遍历扩展,运算速度快点
总结:第一种做法的性能优于第二种