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

完了

DAX 式で変数を使用すると、複雑さを抑え、より効率的な計算を記述できます。 変数は、Power BI Desktop を使い始めたばかりの開発者は十分に活用できませんが、効率的であるため、メジャーを作成する際には既定で使用する必要があります。

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

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

  • パフォーマンスが向上 - 変数を使用すると、Power BI で同じ式を複数回評価する必要がなくなるため、メジャーの効率が向上します。 クエリで、元の処理時間の約半分で同じ結果を得ることができます。

  • 読みやすさが向上 - 変数に自己記述型の短い名前を付け、あいまいで複数の語からなる式の代わりに使用します。 変数が使用されていると、数式が読みやすく、理解しやすくなることがわかります。

  • デバッグが簡略化 - 数式とテスト式のデバッグに変数を使用でき、トラブルシューティングの際に役立ちます。

  • 複雑さが軽減 - 変数を使用すると、理解が難しい EARLIER または EARLIEST DAX 関数を使用する必要がなくなります。 これらの関数は、変数が導入される前は必須で、新しいフィルター コンテキストを導入する複雑な式の中で記述していました。 これらの関数の代わりに変数を使用できるようになったので、複雑な数式の記述を減らすことができます。

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

変数を使用してメジャーの効率を向上させる方法を説明するために、次のテーブルではメジャー定義を 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 式を一時的に書き換えます。 メジャー定義は、SalesPriorYear 変数だけを返します。これは、RETURN 式の後に来るためです。

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

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