在 Power BI 中使用 DirectQuery 连接到 SAP HANA 数据源

可以使用 DirectQuery 直接连接到 SAP HANA 数据源,这通常要求大型数据集超过可用资源来支持导入模型。 在 DirectQuery 模式下连接到 SAP HANA 有两种方法,每个方法具有不同的功能:

  • 将 SAP HANA 视为多维源(默认值): 在这种情况下,Power BI 连接到 SAP Business Warehouse 或 Analysis Services 等其他多维源时的行为类似。 作为多维源连接到 SAP HANA 时,会选择单个分析或计算视图,并且该视图的所有度量值、层次结构和属性均在字段列表中可用。 不能在语义模型中添加计算列或其他数据自定义项。 创建视觉对象时,直接从 SAP HANA 检索聚合数据。 将 SAP HANA 视为多维源是新建 SAP HANA DirectQuery 报表时的默认设置。

  • 将 SAP HANA 视为关系源:在本例中,Power BI 将 SAP HANA 视为关系数据源。 此方法提供更大的灵活性。 此外,还可以添加计算列并包括来自其他源的数据,但必须小心以确保度量值按预期聚合。 避免使用非累加性度量。 此外,请确保使用包含少量列和联接的简单视图以避免性能问题。 请考虑在语义模型中重新创建度量值,但请记住,复杂的度量值可能不会折叠。 将 SAP HANA 用作关系源时,SAP HANA 层次结构不可用。

连接方法由全局工具选项确定,确定方式是选择“文件”>“选项和设置”,再选择“选项”>“DirectQuery”,然后选择“将 SAP HANA 视为关系源”选项,如下图所示

“选项”对话框的屏幕截图,其中显示了 DirectQuery 选项。

“将 SAP HANA 视为关系源”选项可控制将 DirectQuery 用于 SAP HANA 的所有新报表的连接方式。 它不会影响当前报表中的任何现有 SAP HANA 连接,也不会影响打开的任何其他报表中的连接。 因此,如果选项当前未选中,则在使用 获取数据向 SAP HANA 添加新连接时,该连接将 SAP HANA 视为多维源。 但是,如果打开同时连接到 SAP HANA 的其他报表,该报表会根据创建时设置的选项继续运行。 这一事实意味着,连接到 SAP HANA 的任何报告在视 SAP HANA 为关系源时,即便选项现在未选中,它们仍将继续这样处理。

这两种 SAP HANA 连接方法构成不同的行为,无法将现有报表从一个连接方法切换到另一个连接方法。

将 SAP HANA 视为多维源(默认值)

默认情况下,与 SAP HANA 的所有新连接都使用此连接方法,将 SAP HANA 视为多维源。 将 SAP HANA 作为多维源连接到时,需要注意以下事项:

  • 获取数据导航器中,可以选择单个 SAP HANA 视图。 无法选择单个度量值或属性。 连接时未定义查询,这不同于导入数据或在使用 DirectQuery 将 SAP HANA 作为关系源时定义查询。 此注意事项还意味着,选择此连接方法时无法直接使用 SAP HANA SQL 查询。

  • 所选视图的所有度量值、层次结构和属性都显示在字段列表中。

  • 由于在视觉对象中使用度量值,因此将查询 SAP HANA,在视觉对象所需的聚合级别检索度量值。 处理非累加性度量值(如计数器和比率)时,所有聚合都由 SAP HANA 执行,Power BI 不会再执行任何聚合。

  • 为了确保始终可以从 SAP HANA 获取正确的聚合值,必须施加某些限制。 例如,无法添加计算列,也不能合并同一报表中多个 SAP HANA 视图中的数据。 也不能删除列或更改其数据类型。

虽然将 SAP HANA 视为多维源没有替代的关系方法那么灵活,但它更简单易懂。 此连接方法确保在处理更复杂的 SAP HANA 度量值时正确计算聚合值,并且通常会提高性能。

字段 列表包括 SAP HANA 视图中的所有度量值、属性和层次结构。 请注意使用此连接方法时适用的以下行为:

  • 默认情况下,至少一个层次结构中包含的任何属性都处于隐藏状态。 但如果需要,可以通过从字段列表的上下文菜单中选择“查看隐藏”进行查看。 如有必要,可以从同一上下文菜单中看到它们。

  • 在 SAP HANA 中,可以将属性定义为使用另一个属性作为其标签。 例如,产品,其值 123等,可以使用 产品名称,其值 BikeShirtGloves等作为其标签。 在这种情况下,字段列表中会显示一个字段 Product,其值是标签 BikeShirtGloves等,但根据键值 123进行排序并通过这些键值确定唯一性。 还会创建一个隐藏列 Product.Key,以便在必要时访问基础密钥值。

在连接时会显示基础 SAP HANA 视图中定义的任何变量,并且可以输入必要的值。 通过从功能区中选择“转换数据”,然后从显示的下拉菜单中选择“编辑参数”,可以稍后更改这些值

鉴于需要确保始终可以从 SAP HANA 获取正确的聚合数据,允许的建模操作比使用 DirectQuery 时的一般情况更为严格。 但是,仍可以进行一些添加和更改,包括定义度量值、重命名和隐藏字段以及定义显示格式。 刷新时会保留所有此类更改,并应用对 SAP HANA 视图所做的任何不冲突更改。

其他建模限制

除了上述限制之外,在以多维源的形式连接到 SAP HANA 时,请注意以下建模限制:

  • 不支持计算列: 禁用创建计算列的功能。 这一事实还意味着,依赖于计算列的分组和聚类分析不可用。
  • 度量值的其他限制: 用于度量值的 DAX 表达式受到其他限制,以展现 SAP HANA 提供的支持级别。 例如,不能对表使用聚合函数。
  • 不支持定义关系: 只能在报表中查询单个视图,因此不支持定义关系。
  • 没有数据视图:数据视图通常显示表中的详细信息级别数据。 鉴于多维源的性质,当将 SAP HANA 用作多维源时,此视图不可用。
  • 列和度量值详细信息是固定的: 字段列表中的列和度量值由基础源确定,无法修改。 例如,无法删除列,也不能更改其数据类型。 但是,可以重命名它。

其他可视化限制

连接到作为多维源的 SAP HANA 时,视觉对象中存在限制:

  • 没有列聚合:不能更改视觉对象上的列的聚合,而且它始终为不汇总

将 SAP HANA 视为关系源

为了将 SAP HANA 作为关系源进行连接,您必须选择 文件>选项和设置,然后选择 选项>DirectQuery,最后选择 将 SAP HANA 设为关系源的选项

将 SAP HANA 用作关系源时,提供了一些额外的灵活性。 例如,可以创建计算列,包括来自多个 SAP HANA 视图的数据,以及创建生成的表之间的关系。 但是,连接到作为多维源的 SAP HANA 时,行为存在差异,尤其是在 SAP HANA 视图包含非累加性度量值(例如非重复计数或平均值)而非简单求和值时。 非累加性度量值可能会产生错误的结果。 这些措施还可以降低 SAP HANA 中查询计划优化的效率,并导致查询性能不佳和超时。

将 SAP HANA 理解为关系源

当“获取数据”或“Power Query 编辑器”中定义的查询执行聚合时,最好先弄清关系源(如 SQL Server)的行为。 在以下示例中,“Power Query 编辑器”中定义的查询按 ProductID 返回平均价格

关系图,显示 Power Query 编辑器中定义的查询,该查询按产品 ID 返回平均价格。

如果数据已导入到 Power BI 而不是使用 DirectQuery,则以下情况将产生:

  • 数据按照在 Power Query 编辑器中创建的查询所定义的聚合级别进行导入。 例如,按产品列出的平均价格。 此事实产生了一个表格,其中的两列 ProductIDAveragePrice 可以用于可视化。
  • 在一个视觉化图形中,任何后续聚合(例如 SumAverageMin等)都是在导入的数据上执行的。 例如,在视觉对象中包含 AveragePrice 时,将默认使用 Sum 聚合,并针对每个 ProductID 在 AveragePrice 上返回总和,在本例中为 13.67。 这同样适用于在视觉对象中使用的任何替代聚合函数(如 Min 或 Average 等)。 例如,AveragePrice 的 Average 返回 6.66、4 和 3 的平均值,即等于 4.56,而不是基础表中六个记录中的 Price 的平均值 5.17

如果使用相同的关系源上的 DirectQuery,而不是 Import,则相同的语义适用并且结果将完全相同:

  • 鉴于同一查询,逻辑上完全相同的数据呈现给报告层,即使数据实际上并未导入。

  • 在视觉对象中,任何后续聚合(例如 Sum、Average 和 Min)再次通过查询中的逻辑表执行。 同样,一个包含 AveragePrice 的平均值的视觉对象返回相同的 4.56

当连接被视为关系源时,请考虑 SAP HANA。 Power BI 可与 SAP HANA 中的 分析视图计算视图 配合使用,这两种视图都可以包含度量值。 但是现在,用于 SAP HANA 的方法在本部分中遵循如上所述的相同原则:“获取数据”或“Power Query 编辑器”中定义的查询将确定可用数据,然后视觉对象中的任何后续聚合都在该数据上执行,这同样适用于导入和 DirectQuery。 但是,鉴于 SAP HANA 的特性,在初始 获取数据 对话框或 Power Query 编辑器 中定义的查询始终是聚合查询,并且通常包括由 SAP HANA 视图定义的实际聚合的度量值。

与前面的 SQL Server 示例等效的是,有一个 SAP HANA 视图,其中包含 IDProductIDDepotID,以及视图中定义的度量值(包括 AveragePrice),这些度量值在视图中定义为 平均价格

如果在“获取数据”体验中,所做的选择是针对 ProductID 和 AveragePrice 度量值,那么即是在定义对该视图的查询,请求该聚合数据。 在前面的示例中,为了简单起见,使用了与 SAP HANA SQL 确切语法不匹配的伪 SQL。 视觉对象中定义的任何更深入聚合都将进一步聚合此类查询的结果。 同样,如前面所述的 SQL Server 一样,此结果适用于 Import 和 DirectQuery 情况。 在 DirectQuery 用例中,将在发送到 SAP HANA 的单个查询的嵌套 select 语句中使用来自“获取数据”或“Power Query 编辑器”的查询,因此实际上在进一步聚合之前,并不读入所有数据

由于上述所有考虑事项和行为,因此在通过 SAP HANA 使用作为关系来源的 DirectQuery 时需注意以下重要事项:

  • 每当 SAP HANA 中的度量值并非累加时(例如不是简单的 Sum、Min 或 Max),必须注意在视觉对象中执行的任何进一步聚合

  • 获取数据 或 Power Query 编辑器中,仅应包含所需的列才能检索必要的数据,这反映了结果是一个查询,该查询必须是可发送到 SAP HANA 的合理查询。 例如,如果选择了多个列,认为在后续视觉对象中可能需要这些列,那么即使是对于 DirectQuery,简单的视觉对象也意味着嵌套 select 语句中使用的聚合查询将包含这些列,这样通常执行效果较差并且可能产生超时。

在以下示例中,在 “获取数据” 对话框中选择五列(CalendarQuarterColorLastNameProductLineSalesOrderNumber),并且包含度量值 OrderQuantity,这意味着以后创建一个包含 Min OrderQuantity 的简单视觉效果,会导致对 SAP HANA 发出以下 SQL 查询。 阴影部分是嵌套 select 语句,其中包含“获取数据”/“Power Query 编辑器”中的查询。 如果此嵌套 select 语句提供高基数结果,则可能造成 SAP HANA 性能非常不佳或遇到超时。 影响性能的原因不是因为 Power BI 在嵌套 select 中请求所有字段;大部分字段将被外部查询过滤掉。 更准确的说,造成影响的原因是嵌套 select 中的一些措施迫使它在 HANA 服务器中实现具体化。

查询示例的屏幕截图,其中显示了 SAP HANA 的 SQL 查询。

由于该行为,我们建议在 获取数据 或 Power Query 编辑器中仅选择必要的项,同时确保对 SAP HANA 进行的查询是合理的。 如果可能,请考虑在语义模型中重新创建所有必需的措施,并更像传统关系源那样使用 SAP HANA。

最佳做法

对于连接到 SAP HANA 的这两种方法,请遵循有关使用 DirectQuery 的一般建议,尤其是与确保良好查询性能相关的建议。 有关详细信息,请参阅在 Power BI 中使用 DirectQuery

注意事项和限制

以下列表描述了未完全支持的所有 SAP HANA 功能,或者使用 Power BI 时行为不同的功能。

  • 父子层次结构: Power BI 中不可见父子层次结构。 这是因为 Power BI 使用 SQL 接口访问 SAP HANA,并且无法使用 SQL 完全访问父子层次结构。
  • 其他层次结构元数据: 层次结构的基本结构显示在 Power BI 中,但某些层次结构元数据(例如控制不规则层次结构的行为)不起作用。 同样,这是由于 SQL 接口施加的限制。
  • 使用 SSL 连接:可以将导入和多维与 TLS 结合使用来进行连接,但不能连接到配置为将 TLS 用于关系连接方法的 SAP HANA 实例
  • 对属性视图的支持: Power BI 可以连接到分析和计算视图,但无法直接连接到属性视图。
  • 对目录对象的支持: Power BI 无法连接到 Catalog 对象。
  • 发布后更改为变量: 发布报表后,无法直接在 Power BI 服务中更改任何 SAP HANA 变量的值。

已知问题

以下列表描述了使用 Power BI 连接到 SAP HANA (DirectQuery)时的所有已知问题。

  • 查询计数器和其他度量值时遇到的 SAP HANA 问题:如果连接到分析视图,且计数器度量值和其他一些比率度量值包含在同一视觉对象中,则从 SAP HANA 返回错误的数据SAP 注释 2128928(查询计算列和计数器时的异常结果)中介绍了此问题。 在这种情况下,比率度量值不正确。

  • 单个 SAP HANA 列中的多个 Power BI 列: 对于某些计算视图(其中多个层次结构中使用 SAP HANA 列),SAP HANA 会将该列公开为两个单独的属性。 此方法会导致在 Power BI 中创建两个列。 但是,默认情况下,这些列是隐藏的,所有涉及层次结构或直接涉及列的查询都能够正常工作。

有关 DirectQuery 的详细信息,请查看以下资源: