使用 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 可以定义为时间相关数据源。随后会向该特征添加两个额外的字段或属性:0DATEFROM0DATETO。而 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

本课其余配图

IntroCP_image_LJ

CompositeProviderOverview_1_LJ

CompositeProviderOverview1_LJ

FutureofCompositeProvider_LJ

NewCentralCP_UNION_LJ

HCPR_JOIN_Image_LJ

CP_Temp_Join_LJ

CP_Proj_Aggr_LJ

CP_NavAttributes1_image_LJ

CP_NavAttributes2_image_LJ

CompositeProvider nested_LJ

BWRSA1functionsoftheCP_LJ

本课其余配图

CompositeProvider nested_LJ

本课其余配图

CompositeProvider nested_LJ

本课其余配图

CompositeProvider nested_LJ