使用 CompositeProvider
学习目标
创建 CompositeProvider 并描述它们支持的各种建模场景
CompositeProvider 简介
CompositeProvider 的作用
CompositeProvider 的作用是在 SAP BW/4HANA 中提供一个可由查询消费的虚拟数据集市层。
CompositeProvider 是一个高度灵活、用途广泛的对象,它取代了 SAP BW 中的多个建模对象,包括 MultiProvider、InfoSet 以及最初随 SAP BW powered by SAP HANA 交付的第一代 CompositeProvider。
你应始终在 CompositeProvider 之上构建 BW 查询。这与 SAP BW 中当时以 MultiProvider 作为查询构建对象的最佳实践类似。此方法可确保对查询底层数据源的更改能够被轻松管理。例如,你可以轻松地用更新后的 DataStore 对象(advanced)替换底层对象,而无需调整查询。
你可以在 CompositeProvider 中使用灵活的联接(join)和/或并集(union)逻辑组合不同类型的 SAP BW/4HANA 对象。这在 SAP BW 中是一个重大限制,当时 MultiProvider 只支持并集,而联接必须在单独的 InfoSet 中实现。
你甚至可以在 CompositeProvider 之上构建 CompositeProvider,以支持高度的复用。还可以在 CompositeProvider 层级生成额外的计算字段,这意味着你不再需要在查询中定义此类计算,或将计算持久化到底层 DataStore 对象(advanced)中。
CompositeProvider 还可以直接消费 SAP HANA 数据库中的计算视图。你甚至可以将 SAP BW/4HANA 和 SAP HANA 的对象混合使用,构建混合模型,把存储在 SAP BW/4HANA 中的历史数据与存储在支持业务应用的 SAP HANA 表中的实时数据结合起来。
如前所述,在 SAP BW 环境中,虚拟数据集市是通过 MultiProvider 实现的。它们因以下原因被广泛使用:
作为所有与报表相关对象(主要是 BEx 查询)的接口:通过这种方式,可以将报表对象与物理数据集市层的持久化 InfoCube 解耦。这意味着只要 MultiProvider 保持不变,对 InfoCube 的更改就不会损害你的报表。
数据集市的语义分区:物理数据集市可以划分为多个较小的单元,并通过 MultiProvider 的 UNION 能力进行集成。这为你的数据模型带来了更大的灵活性,并支持加载和报表流程的并行处理。这带来了显著的性能提升。
现在,CompositeProvider 承担了这些关键职责,并增加了更多功能。
CompositeProvider 使你能够减少数据仓库中的数据持久化。这是因为在 SAP BW 中,联接操作大多在数据准备(staging)期间完成,结果被持久化到 DataStore 对象中。而使用新的 CompositeProvider,可以在数据集上执行联接而无需持久化。
提示
CompositeProvider 的 TLOGO 名称是 HCPR("HANA CompositeProvider")。过去还有另一种已过时的 CompositeProvider 类型,现在仅用于 BW Workspaces,其 TLOGO 名称为 COMP。
启动下一个演示,在 BW Modeling Tools 中探索 CompositeProvider。
使用 BW Modeling Tools 探索 CompositeProvider
演示:Watch Demo(SAP 官方交互式练习)
为 CompositeProvider 建模
在 CompositeProvider 中为并集和联接建模
定义 CompositeProvider 时,可以使用并集,它将来自多个提供者的数据组合起来,并为相关数据构建并集集合。所有值都会被合并。
定义 CompositeProvider 时,也提供联接,它使用特定条件组合来自各表的数据。
并集与联接
你可以使用 UNION 或 JOIN 将以下 InfoProvider 类型组合到 CompositeProvider 中:
带更改日志的标准 DataStore 对象
已启用报表的数据准备 DataStore 对象
数据集市 DataStore 对象
InfoObject
CompositeProvider
Open ODS View(见注释)
BAdI Provider(仅限并集)
SAP HANA 计算视图
注意
BAdI Provider 只能用于并集。要将 Open ODS View 纳入 CompositeProvider 中的联接,Open ODS View 中的设置 CalcScenario Used 应取值 Yes(另请参见 SAP 注释 2036430)。
一般需要考虑的事项:
不支持将为 SAP BW InfoProvider 生成的外部 SAP HANA 视图用作 CompositeProvider 的输入对象(参见 SAP 注释 2458572)。
你希望在 CompositeProvider 中使用的 Open ODS View 只能包含具有 InfoObject 兼容数据类型的字段。这些数据类型如下:CHAR、CUKY、CURR、DEC、DATS、FLTP、INT4、NUMC、TIMS、QUAN、UNIT。对于特别长的特征类字段值,也支持数据类型 STRG。
对于 DataStore 对象(advanced),可以从近线存储(near-line storage)读取用于并集和联接的数据。
分配字段时,系统会检查目标字段是否适合所执行的分配。如果目标字段尚未在源结构中分配给另一个字段,则该目标字段是适合的。此外,系统还会验证它是否具有兼容的数据类型。有关所有细节,请参阅 SAP 注释 2228967(Understanding Automatic Field Assignment in the CompositeProvider)。
时态联接
CompositeProvider 还支持为时态联接建模,以刻画时间流。在 SAP BW/4HANA 中,只有主数据 InfoObject 可以定义为时间相关数据源。随后会向该特征添加两个额外的字段或属性:0DATEFROM 和 0DATETO。而 DataStore 对象(advanced)不能定义为时间相关。尽管如此,它们通常包含时间特征(可以从中推导出时间区间),或者至少包含两个引用 0DATE 的 InfoObject(你可以据此定义时间区间)。这使得 CompositeProvider 中的 DataStore 对象(advanced)可以被视为时间相关。一旦 CompositeProvider 中包含的某个 InfoProvider 被设为伪时间相关,它就会被当作时间相关数据源处理。伪时间相关 InfoProvider 与 InfoObject 这类时间相关 InfoProvider 的一个重要区别是:系统无法阻止时间流中出现间隙或重叠。这始终取决于伪时间相关 InfoProvider 的数据集。
对于基于时态联接的 CompositeProvider,以下限制适用:
时态联接中不允许有并集节点
生成的 CompositeProvider 不能包含任何未分配的字段
只能使用带更改日志的标准 DataStore 对象、已启用报表的数据准备 DataStore 对象、数据集市 DataStore 对象和 InfoObject
在 CompositeProvider 中为投影和聚合建模
聚合和投影节点在 CompositeProvider 中通常并非必需。仅在少数特定用例中,使用它们才可能有意义,例如:
直接在 PartProvider 之上定义过滤器或计算。
为某个关键指标定义不同的聚合行为,例如与强制分组(force group by)结合使用。
需要在联接节点之间进行数据聚合。
使用投影节点为 DataStore 对象(advanced)和 Open ODS View 阻止 PartProvider 的默认聚合。 默认情况下,CompositeProvider 读取的 PartProvider 数据已经聚合,并且直接在 PartProvider 之上的并集也会对数据做聚合。这也意味着 PartProvider 的数据会在执行联接之前被聚合。这种聚合对于模糊联接(ambiguous join)处理等场景是必要的。现在,对于 DataStore 对象(advanced)和 Open ODS View,可以通过直接在 PartProvider 之上使用投影节点来跳过 PartProvider 数据的直接聚合。由此带来了新的可能,例如直接为某个 PartProvider 使用不同的聚合行为。为此,需要在该投影之上再放一个聚合节点,并为关键指标指定不同的聚合行为。这便成为该关键指标所使用的第一个聚合行为。
在 CompositeProvider 中为字段分配、新字段或计算字段建模
在 CompositeProvider 场景编辑器中,用户可以创建和修改源结构字段(列)与目标结构字段(列)之间的分配。源结构包含物理 InfoProvider 的字段,或同一个 CompositeProvider 模型中另一个视图节点的字段。在映射上下文中,目标结构始终是一个视图节点。它要么是输出(默认)节点,要么是任何其他中间视图节点。
CompositeProvider 支持多种视图节点类型:并集、联接、聚合或投影。输出视图节点(默认节点)是 CompositeProvider 中所有视图节点集合里的一个专用视图节点。该视图节点在被作为报表视图消费时定义了 CompositeProvider 的语义。只有输出节点中的字段对 SAP BW/4HANA 报表工具可见。
在为 CompositeProvider 建模期间,源结构的字段会被映射到最终目标结构。在分配过程中会发生两件关键的事情。首先,编辑器尝试在目标视图节点结构中识别一个可能的目标字段。其次,它检查所选的目标字段是否适合分配。现有目标字段在满足以下条件时是适合的:
它尚未分配给源字段所在同一源结构中的另一个字段
它具有二进制兼容的数据类型
如果找不到适合的现有目标字段,则会创建一个具有适当 InfoObject 类型和数据类型的新目标字段,然后将其分配给源字段。完成的分配由一条实线表示,该实线将左侧的源字段连接到右侧的目标字段。用于分配的源字段可以是视图节点的字段、原生 SAP HANA 计算视图的字段,或 SAP BW InfoProvider 的字段。通过评估兼容性规则来确保数据类型兼容。
提示
有关这些规则的详细信息,请参见 SAP 注释 2228967(Understanding Automatic Field Assignment in the BW Composite Provider)。
可以在目标结构中添加新字段或创建计算字段。这些附加字段的逻辑直接在 SAP HANA 中应用。上下文菜单在目标结构的场景选项卡中提供功能创建字段... / 创建计算字段…。在 UI 对话框中,你可以填写所有必要信息,包括 SQL 表达式。新字段将带有计算字段图标,并会被自动向上映射。不允许向计算字段传入任何映射。
在 CompositeProvider 中为导航属性建模
过去的 MultiProvider 与 SAP BW/4HANA 中的 CompositeProvider 之间存在细微差别。过去,你可以为导航属性建模不同的来源,这可能让其他用户感到困惑。例如,CUSTOMER__COUNTRY 可以分配给数据模型中任何其他国家的字段,并且无法保证该字段真正代表客户对象的国家信息。SAP 已针对 CompositeProvider 改变了这一点,不再允许对导航属性进行这类异步映射。导航属性只在相关的 InfoObject 中开启,不再可用于建模不同的映射。
导航属性仍可作为源字段使用,但默认不可用;此功能需要手动开启。在场景选项卡中,从每个 PartProvider 中选择显示未分配的导航属性,使这些字段可作为为 CompositeProvider 建模的源。然而,在 CompositeProvider 的目标结构中,导航属性不可用。它们在输出选项卡中管理,并且可以为每个包含可导航属性的 InfoObject 开启。
提示
请参阅 SAP 注释 2215947 - How to Set Navigation Attributes for a DataStore Object (advanced), a CompositeProvider or an Aggregation Level。
在其他 SAP BW/4HANA 对象中消费 CompositeProvider
嵌套 CompositeProvider
你可以将一个 CompositeProvider 用作另一个 CompositeProvider 中的 PartProvider。要启用这种消费方式,请先为该功能释放该 CompositeProvider。在 CompositeProvider 建模器 UI 的常规选项卡中,选择此 CompositeProvider 可以添加到另一个 CompositeProvider。但是,SAP 仅支持两级消费。这意味着一个消费了另一个 CompositeProvider 的 CompositeProvider 不能再作为第三个 CompositeProvider 的一部分。此外,在 SQL 根操作和 PartProvider 类型方面,支持的场景也有限制。
提示
你可以查看此资源,了解有关 CompositeProvider 场景的更多信息:https://help.sap.com/docs/SAP_BW4HANA/107a6e8a38b74ede94c833ca3b7b6f51/a803e5acb5b042548f744fcd3af0858f.html
CompositeProvider 作为转换的源
与过去的 MultiProvider 一样,新的 CompositeProvider 也可以作为转换的源。这可能对特殊需求很有用,例如当 SQL 联接/并集应持久化到 DataStore 对象(advanced)中时。类型为 FULL 的抽取始终可用。满足以下条件时,可以使用 DELTA 类型抽取:
CompositeProvider 的根操作是并集。
CompositeProvider 仅由 DataStore 对象(advanced)组成。
所有 DataStore 对象(advanced)均为数据集市 DataStore 对象类型(因此其行为类似 InfoCube)。
与性能和数据质量相关的最佳实践
在 SAP BW/4HANA 2.0 SP04(2020 年 3 月)中,CompositeProvider 的建模可能性得到扩展,目的是在 CompositeProvider 中提供更多选项,并减少 SAP HANA 与 SAP BW/4HANA 之间混合建模的必要性。所有新选项都经过 SAP HANA 优化,但请注意,直接在 PartProvider 上使用简单并集才能保证最佳性能。利用这些增强功能可能会以性能为代价——就像为 SAP HANA 计算视图建模时一样。
以下设计考虑和建议提供了一些有用的指导,以避免建模错误:
内联接(Inner Join) 与左外联接(Left Outer Join):如果可能,请使用内联接,因为这种联接总是更快。
如果 参照完整性(Referential Integrity) 有保证,你应在 输出 选项卡上设置相应的标志。之后你需要确保提供者中该特征的每个值都恰好有一条主数据记录。如果存在参照完整性,这可以提升性能。
在混合场景中结合 SAP HANA 计算视图使用 OLAP 函数 :如果你大量使用 BW OLAP 函数,我们建议仅使用 BW 持久化的 InfoProvider。这可以确保使用 BW OLAP 函数时获得最佳性能。只有当查询中使用的所有字段都具有主数据 ID(SID)时,OLAP 函数(例如异常聚合)才能在 SAP HANA 中以优化方式执行。然而,SAP HANA 计算视图没有 SID。
提示
SAP 注释 2271658 提供了一份不断增长的建议和最佳实践清单,为在性能和数据质量方面为 CompositeProvider 建模提供指导
SAP GUI 支持功能
事务 RSOHCPR 在 Data Warehousing Workbench 中提供以下基本工具来处理 CompositeProvider:
使用位置清单(Where-used list)
对象目录条目和传输连接
显示数据
显示元数据
显示数据模型
重建 ColumnView
本课其余配图












本课其余配图

本课其余配图

本课其余配图
