<div class="preview-main">
<p> 多数据集关联报表是很常见的报表形式,它允许开发者分别从不同的来源(表或数据库)分别准备数据形成不同的数据集,在报表端(模板)通过表达式描述数据集间的关系完成关联。这样可以避免在数据准备时写过于复杂的 SQL/ 存储过程,降低维护难度。尤其当报表数据来源于多个数据库时,多数据集的优势更加明显。 </p>
<p> 凡事都有两面性,多数据集为开发带来方便的同时却对性能造成了极大的影响。在报表端进行多数据集关联时要计算关联表达式(举例:ds2.select(name,,id==A1))时,报表引擎一般会采用顺序遍历的方式进行,先拿一个数据集的第一条记录去第二个数据集中遍历查找符合条件的记录,然后是第二条,第三条…。因此两个数据集关联的时间复杂度是 O(n),数据量不大时感受还不明显,数据量稍大一些就会很慢,随着数据集数量的增多报表性能也会呈指数下降。 </p>
<p> 因此在实际报表业务中,当多数据集关联导致报表性能降低时可以考虑将多个数据集 SQL 合并成一句,利用数据库的关联计算能力提升性能。但这种方式又会导致 SQL 过于复杂,很难维护,而太复杂的 SQL 很可能被数据库搞错优化路径,结果性能仍不可控。并且合并 SQL 的方式有适用场景的限制(如无法完成跨异构库关联、文本关联等)。 </p>
<p> 下面介绍采用集算器的优化方法,写法简单且性能高,能够普遍适用于各种场景: </p>
<ol class="list-paddingleft-2"><li> <p> <strong> <strong> 单数据库,多个数据集 SQL 比较复杂,很难写成一句 </strong> </strong> </p> </li><li> <p> <strong> <strong> 单数据库,多数据集中使用了存储过程,无法整合成一句 SQL </strong> </strong> </p> </li><li> <p> <strong> <strong> 单数据库,多数据集合并成一句 SQL 后性能仍不如人意 </strong> </strong> </p> </li><li> <p> <strong> <strong> 多数据库,多数据集来源多个数据库,无法通过一句 SQL 进行查询 </strong> </strong> </p> </li><li> <p> <strong> <strong> 涉及文件数据,多数据集中部分数据来自文件,无法使用 SQL 进行统一查询 </strong> </strong> </p> </li></ol>
<p> 不同于 SQL(关系代数)采用笛卡尔积再过滤的方式看待 JOIN,基于离散数据集模型的集算器将关联运算做了区分(只考虑等值 JOIN):多对一的主外键表采用外键属性化方式关联、一对一的同维表采用同维表等同化方式关联、一对多的主子表采用主子表一体化关联,针对不同的表间关系采用不同算法进行运算,可以获得更简单的写法和更高的性能以及更广泛的适用范围。 </p>
<p> 我们将通过一些示例来说明面向各种情况时,如何使用集算器获得最优的实现和效率。需要说明的是,为了描述方便我们使用抽象后最简单的情况说明各种关联运算,实际业务会复杂得多,每个数据集 SQL 也会复杂得多,但是不管怎样多数据集关联关系也逃不出多对一、一对一和一对多的情况,所以拿原子操作来说明问题,以期大家遇到问题时可以采用最合适的方式处理。 </p>
<h2> <a href="http://c.raqsoft.com.cn/forward?goto=%23%E6%8A%A5%E8%A1%A8%E9%9B%86%E6%88%90"> </a> <a href="http://c.raqsoft.com.cn/forward?goto=%23%E6%8A%A5%E8%A1%A8%E9%9B%86%E6%88%90"> </a> <strong> <strong> 报表集成 </strong> </strong> </h2>
<p> 这里假定读者已经了解集算器与报表的关系,集算器仅为报表提供数据准备,将原来的多数据集通过集算器完成关联计算,将计算以结果以单 / 多数据集的方式提供给报表进行呈现。 </p>
<p> 集算器脚本可以直接被润乾报表 5.0 及以上版本直接引用(集算器数据集);如果是其他报表工具,集算器提供了标准 JDBC 和 ODBC 接口,可以采用类似调用存储过程的方式调用集算器脚本,详细可以参考教程《 <a href="http://c.raqsoft.com.cn/forward?goto=http%3A%2F%2Fdoc.raqsoft.com.cn%2Fesproc%2Ftutorial%2Fbjavady.html"> 应用集成 - 被 JAVA 调用 </a> 》章节,以及《集算器与 BIRT 集成》或《集算器与 JasperReport 集成》。 </p>
<p> 因此下面大部分例子将省略报表制作部分,主要说明集算器处理多数据集关联计算的过程。 </p>
<h2> <a href="http://c.raqsoft.com.cn/forward?goto=%23%E5%A4%96%E9%94%AE%E8%A1%A8%E5%A4%9A%E5%AF%B9%E4%B8%80"> </a> <a href="http://c.raqsoft.com.cn/forward?goto=%23%E5%A4%96%E9%94%AE%E8%A1%A8%E5%A4%9A%E5%AF%B9%E4%B8%80"> </a> <strong> <strong> 外键表(多对一) </strong> </strong> </h2>
<p> 表 A 的某些字段与表 B 的主键关联。A 表称为事实表,B 表称为维表。A 表中 |
|