在 Power BI Desktop 中应用假设引用完整性设置

当连接到使用 DirectQuery 的数据源时,你可以使用“假设引用完整性”选项对数据源运行更高效的查询。 此功能对基础数据有一些要求,并且仅在使用 DirectQuery 时可用。

设置“假设引用完整性”,使数据源上的查询使用 INNER JOIN 语句而不是 OUTER JOIN 语句,从而提高查询效率。

Screenshot of an Edit Relationship dialog to select Assume Referential Integrity.

使用假设引用完整性的要求

这是一项高级设置,仅在连接到使用 DirectQuery 的数据时才可用。 若要使“假设引用完整性”正常工作,必须满足以下要求:

  • 关系中 From 列中的数据始终不能为 Null空白
  • From 列中的每个值在 To 列中都有对应的值

在这种情况下,From 列是一对多关系中的“多”,或是一对一关系中第一个表中的列。

使用假设引用完整性的示例

下面的示例演示了在数据连接中使用“假设引用完整性”时它的表现。 该示例连接到包含订单表、产品表和仓库表的数据源。

  • 下图显示了 Orders 表和 Products 表,引用完整性存在于 Orders[ProductID] 和 Products[ProductID] 之间。 Orders 表中的 [ProductID] 列始终不能为 Null ,所有值也会出现在 Products 表中。 在这种情况下,应设置“假设引用完整性”以获得更高效的查询。 使用此设置不会更改视觉对象中显示的值。

    Screenshot of Orders table and Products table.

  • 在下一个图像中,请注意 Orders[DepotID] 和 Depots[DepotID] 之间不存在引用完整性,因为某些 Orders 的 DepotID 为 Null 。 在这种情况下, 应设置“假设引用完整性”。

    Screenshot of Orders table and Depots table.

  • 最终,下表中的 Orders[CustomerID] 和 Customers[CustID] 之间不存在引用完整性。 CustomerID 包含一些值(本例中为 CustX),这些值不存在于 Customers 表中。 在这种情况下, 应设置“假设引用完整性”。

    Screenshot of Orders table and Customers table.

设置假设引用完整性

若要启用此功能,请选中“假设引用完整性”,如下图所示。

Screenshot of an Edit Relationship dialog that allows you to select Assume Referential Integrity.

选中后,将对数据验证此设置,以确保没有 Null 或不匹配的行。 但是,在值的数量非常大的情况下,验证不能保证没有引用完整性问题。

此外,验证将在编辑关系时执行,并且 反映数据的任何后续更改。

如果错误地设置了假设引用完整性,会发生什么?

如果在数据中有引用完整性问题时设置“假设引用完整性”,该设置不会导致错误。 但是,会导致数据明显不一致。 例如,在这里所述的 Depots 表的关系下,会导致以下结果:

  • 视觉对象显示总的 订单数量 值为 40
  • 视觉对象显示总的“按仓库城市的订单数量”值仅为 30,因为它不包含订单 ID 1(其 DepotID 为 Null)。