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

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

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

“编辑关系”对话框的屏幕截图,其中可以选中“假设引用完整性”。

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

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

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

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

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

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

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

    Orders 表和 Products 表的屏幕截图。

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

    Orders 表和 Depots 表的屏幕截图。

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

    Orders 表和 Customers 表的屏幕截图。

设置假设引用完整性

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

允许选中“假设引用完整性”的“编辑关系”对话框的屏幕截图。

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

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

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

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

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