如何优化多数据集关联报表性能

多数据集关联报表是很常见的报表形式,它允许开发者分别从不同的来源(表或数据库)分别准备数据形成不同的数据集,在报表端(模板)通过表达式描述数据集间的关系完成关联。这样可以避免在数据准备时写过于复杂的 SQL/ 存储过程,降低维护难度。尤其当报表数据来源于多个数据库时,多数据集的优势更加明显。

凡事都有两面性,多数据集为开发带来方便的同时却对性能造成了极大的影响。在报表端进行多数据集关联时要计算关联表达式(举例:ds2.select(name,,id==A1))时,报表引擎一般会采用顺序遍历的方式进行,先拿一个数据集的第一条记录去第二个数据集中遍历查找符合条件的记录,然后是第二条,第三条…。因此两个数据集关联的时间复杂度是 O(n²),数据量不大时感受还不明显,数据量稍大一些就会很慢,随着数据集数量的增多报表性能也会呈指数下降。

因此在实际报表业务中,当多数据集关联导致报表性能降低时可以考虑将多个数据集 SQL 合并成一句,利用数据库的关联计算能力提升性能。但这种方式又会导致 SQL 过于复杂,很难维护,而太复杂的 SQL 很可能被数据库搞错优化路径,结果性能仍不可控。并且合并 SQL 的方式有适用场景的限制(如无法完成跨异构库关联、文本关联等)

下面介绍采用集算器的优化方法,写法简单且性能高,能够普遍适用于各种场景:

  1. 单数据库,多个数据集 SQL 比较复杂,很难写成一句
  2. 单数据库,多数据集中使用了存储过程,无法整合成一句 SQL
  3. 单数据库,多数据集合并成一句 SQL 后性能仍不如人意
  4. 多数据库,多数据集来源多个数据库,无法通过一句 SQL 进行查询
  5. 涉及文件数据,多数据集中部分数据来自文件,无法使用 SQL 进行统一查询

不同于 SQL(关系代数)采用笛卡尔积再过滤的方式看待 JOIN,基于离散数据集模型的集算器将关联运算做了区分(只考虑等值 JOIN):多对一的主外键表采用外键属性化方式关联、一对一的同维表采用同维表等同化方式关联、一对多的主子表采用主子表一体化关联,针对不同的表间关系采用不同算法进行运算,可以获得更简单的写法和更高的性能以及更广泛的适用范围。

我们将通过一些示例来说明面向各种情况时,如何使用集算器获得最优的实现和效率。需要说明的是,为了描述方便我们使用抽象后最简单的情况说明各种关联运算,实际业务会复杂得多,每个数据集 SQL 也会复杂得多,但是不管怎样多数据集关联关系也逃不出多对一、一对一和一对多的情况,所以拿原子操作来说明问题,以期大家遇到问题时可以采用最合适的方式处理

具体的报表例子和函数分析可以访问该地址:http://c.raqsoft.com.cn/article/1533353655891?r=alice

作者:lisongbo
链接:http://c.raqsoft.com.cn/article/1533353655891
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在帆软报表中,关联数据集是实现复杂报表展示和交互功能的重要手段。通过合理的数据集关联策略,可以提升报表的灵活性与性能,尤其是在处理多维度、多条件切换的场景时。以下是几种常见的关联数据集方式及其实现方法。 ### 使用参数进行数据集切换 当需要根据用户选择的条件动态切换数据集时,可以通过定义参数来实现。具体步骤如下: 1. **创建多个数据集**:根据不同的查询逻辑或数据来源,分别创建多个数据集。 2. **定义参数**:新增一个参数(例如 `dsname`),用于控制当前使用哪个数据集。 3. **设置数据集表达式**:在主数据集中使用表达式判断语句,根据参数值返回对应的数据集名称。例如: ```javascript if (valueOf("dsname") == "dataset1", dataset1, dataset2) ``` 4. **配置下拉框控件**:将该参数绑定到一个下拉框控件上,使用户可以选择不同选项来切换数据集。 这种方式适用于需要在多个结构相似但数据来源不同的数据集之间切换的场景[^3]。 ### 使用 SQL 查询合并数据 当多个数据集之间存在一定的关联关系(如主键-外键关系)时,可以在数据库层面通过 SQL 查询将它们合并为一个数据集。例如,使用 `JOIN` 操作连接多个表,或者通过 `UNION` 合并多个查询结果。 ```sql SELECT t1.*, t2.department_name FROM sales_data t1 JOIN departments t2 ON t1.department_id = t2.id ``` 这种做法适合于数据量较大且需要一次性获取所有相关数据的情况,能够减少前端数据处理的负担[^1]。 ### 使用子数据集与主数据集联动 在某些情况下,可能需要在一个报表中展示多个层级的数据,例如主表与明细表的关系。此时可以使用子数据集,并通过参数传递主数据集中的字段值,实现数据联动。 1. **创建主数据集**:用于展示汇总信息或主表数据。 2. **创建子数据集**:在子数据集中引用主数据集的字段作为过滤条件。 3. **设置参数传递**:在报表设计界面中,将主数据集的字段作为参数传递给子数据集。 这种方法特别适合用于展现具有父子关系的数据结构,比如订单与订单项之间的关系。 ### 自定义下拉框选项并关联至数据集 为了实现更灵活的筛选功能,可以自定义下拉框选项,并将其与数据集进行关联。例如,在 SQL 查询中根据设备名称的首字母分类: ```sql SELECT t1.*, CASE WHEN SUBSTR(t1.EQUIP_NAME, 1, 1) IN ('C', 'R', 'D') THEN 'C' WHEN SUBSTR(t1.EQUIP_NAME, 1, 1) = 'B' THEN 'B' ELSE 'all' END eq FROM equipment_table t1 ``` 然后在报表中设置一个下拉框控件,其值与 `eq` 字段匹配,从而动态筛选数据集内容[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值