変数を使用して、パフォーマンスとトラブルシューティングを向上させる

完了

DAX 数式で変数を使用すると、複雑さを抑え、より効率的な計算を記述できます。 変数は、Power BI Desktop を使い始めたばかりの開発者はあまり使用しませんが、効果的であるため、できる限り使用してください。

式によっては、多くの入れ子関数を使用し、式ロジックを再利用します。 これらの式は処理に時間がかかり、読みにくいため、トラブルシューティングが困難です。 変数を使用すると、クエリの処理時間を短縮できます。 この変更は、セマンティック モデルのパフォーマンスを最適化するための正しい方向への一歩です。

セマンティック モデルで変数を使用すると、次のような利点があります。

  • パフォーマンスの向上 - 変数を使用すると、Power BI が同じ式を複数回評価する必要がなくなるため、メジャーの効率が向上します。 クエリで、元の処理時間の約半分で同じ結果を得ることができます。
  • 読みやすさが向上 - 変数に自己記述型の短い名前を付け、あいまいで複数の語からなる式の代わりに使用します。 変数が使用されていると、数式が読みやすく、理解しやすくなることがわかります。
  • デバッグが簡略化 - 数式とテスト式のデバッグに変数を使用でき、トラブルシューティングの際に役立ちます。
  • 複雑さの軽減 - 変数では、理解しにくい EARLIER 関数や EARLIEST 関数を使用する必要がありません。 これらの関数は、変数が導入される前に必要であり、新しいフィルター コンテキストを導入する複雑な式で記述されました。 これらの関数の代わりに変数を使用できるようになったので、複雑な数式の記述を減らすことができます。

変数を使用してパフォーマンスを向上させる

変数を使用してメジャーの効率を向上させる方法を説明するために、次のテーブルではメジャー定義を 2 つの異なる方法で示しています。 この数式では "前年同期" を計算する式を繰り返していますが、2 つの方法は異なります。最初のインスタンスでは通常の DAX 計算方法を使用し、2 つ目では計算に変数を使用しています。

テーブルの 2 番目の行は、改善したメジャー定義を示しています。 この定義では、VAR キーワードを使用して SalesPriorYear という変数を導入し、式を使用して "前年同期" の結果をその新しい変数に割り当てます。 次に、DIVIDE 関数で変数を 2 回使用します。

変数なし

Sales YoY Growth =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

変数あり

Sales YoY Growth =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
VAR SalesVariance =
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
RETURN
    SalesVariance

最初のメジャー定義では、Power BI が同じ式を 2 回評価する必要があるため、数式は非効率的です。 2 番目の定義は、変数のおかげで、Power BI は PARALLELPERIOD 関数を 1 回だけ評価すればよいため、より効率的です。

セマンティック モデルに複数のメジャーを持つ複数のクエリがある場合、変数を使用することで、全体的なクエリ処理時間が半分に短縮され、セマンティック モデルの全体的なパフォーマンスが向上する可能性があります。 さらに、このソリューションは単純なものであるため、たとえば、パーセンテージを処理し、合計を集計する場合など、数式がより複雑になるとともに節約できます。

変数を使用して読みやすくする

パフォーマンスの向上に加えて、変数を使用するとコードの読み取りが簡単になる場合があります。

変数を使用する場合は、変数にわかりやすい名前を使用することをお勧めします。 前の例では、変数の名前は SalesPriorYear であり、変数が何を計算しているかが明確に示されています。 Xtemp、または variable1 という名前の変数を使用した場合の結果を考えてみましょう。変数の目的はまったく明確ではありません。

明確で簡潔、かつ意味のある名前を使用すると、計算内容を理解してドキュメント化することが容易になり、将来的に他の開発者も保守しやすくなります。

変数を使用して複数ステップのトラブルシューティングを行う

変数を使用すると、数式をデバッグし、問題の原因を特定できます。 変数は、各変数を個別に評価し、RETURN 句で呼び出すことで、DAX 計算のトラブルシューティングのタスクを簡素化します。

次の例で、変数に代入される式をテストします。 デバッグするには、一時的に RETURN 句を書き換えて変数を返します。 メジャー定義は、RETURN 式の後に続く SalesPriorYear 変数のみを返します。

Sales YoY Growth % =
VAR SalesPriorYear =  CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
VAR SalesPriorYear% = DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)  
RETURN SalesPriorYear%

RETURN は、SalesPriorYear% 変数のみ返します。 この方法を使用すると、デバッグが完了したときに式を元に戻すことができます。 また、DAX コードの複雑さが軽減されるため、計算が理解しやすくなります。