Power BI Desktop で [参照整合性を想定] 設定を適用する

DirectQuery を利用し、データ ソースに接続するとき、[参照整合性を想定] の選択を使い、より効率的なクエリをデータ ソースに対して実行します。 この機能には基礎となるデータに関していくつかの要件があり、DirectQuery の利用時にのみ利用できます。

[参照整合性を想定] を設定すると、データ ソースに対するクエリで OUTER JOIN ステートメントではなく INNER JOIN ステートメントを使用できるようになり、クエリの効率性が上がります。

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

[参照整合性を想定] を使うための要件

この設定は高度な設定であり、DirectQuery を利用してデータに接続するときにのみ有効になります。 [参照整合性を想定] が正しく機能するには、次の要件を満たす必要があります。

  • リレーションシップの [From] (参照元) 列のデータを Null または にしない
  • [From] (参照元) 列のデータにはそれぞれ [To] (参照先) 列に対応する値があります。

このコンテキストでは、[From] (参照元) 列は "一対多" 関係の "多" になります。または、"一対多" 関係の最初の表の列になります。

[参照整合性を想定] の使用例

次の例は、データ接続で [参照整合性を想定] を使った場合の動作を示しています。 この例では、OrdersProductsDepots テーブルを含むデータ ソースに接続しています。

  • 次の画像では、Orders テーブルと Products テーブルを確認できます。Orders[ProductID]Products[ProductID] の間に参照整合性が存在します。 Orders テーブルの [ProductID] 列が Null になることはありません。すべての値は Products テーブルにも表示されます。 そのため、より効率の高いクエリを取得するように [参照整合性を想定] を設定する必要があります。 この設定を使っても、視覚エフェクトに表示される値は変わりません。

    Screenshot of Orders table and Products table.

  • 次の画像では、Orders[DepotID]Depots[DepotID] の間に参照整合性がないことに注意してください。一部の Orders に関して、DepotIDNull になっているためです。 そのため、 [参照整合性を想定]設定しない でください。

    Screenshot of Orders table and Depots table.

  • 最後に、次のテーブルの Orders[CustomerID]Customers[CustID] の間に参照整合性は存在しません。 CustomerID には、Customers テーブルには存在しない値 (この場合は CustX) がいくつか含まれています。 そのため、 [参照整合性を想定]設定しない でください。

    Screenshot of Orders table and Customers table.

[参照整合性を想定] の設定

この機能を有効にするには、次の画像のように [参照整合性を想定] を選びます。

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

選択すると、Null や一致しない行がないことが確認する目的でデータに対して設定が検証されます。 ただし、値の数が非常に多い場合、検証しても、参照整合性問題がないことは保証されません。

また、検証は関係を追加したときに行われ、追加後のデータ変更は 反映されません

[参照整合性を想定] を間違えて設定した場合

データに参照整合性の問題があるときに [参照整合性を想定] を設定すると、この設定でエラーは起こりません。 ただし、明らかなデータの不整合が確認できます。 たとえば、ここで説明した Depots テーブルの関係の場合、次のような現象が起こります。

  • 合計 Order Qty を示すビジュアルが値として 40 を示す。
  • 合計 Order Qty by Depot City を表示する視覚エフェクトの合計値がわずか 30 と表示されるのは、DepotIDNull の Order ID 1 が含まれていないためです。