式に関連する Planual のルール

IF を複数回使用しないでください。 数式を複数のライン アイテムに分割し、LOOKUP か代替の構造を使用することをおすすめします。

数式の動作を説明するのに一つの簡単な文よりも長くかかる場合、それはおそらく長すぎます。 式が複雑にならないようにしてください。

Classic Hyperblockでは、計算が一度だけ行われるように、繰り返される式を個別のライン アイテムに分割してください。

Polarisでは、一つの式の中で同じ式を繰り返し記述することは一般的に許容されます。これは、エンジンがそれを式ごとに一度だけ評価するためです。ただし、Polaris において同じ複雑な計算を複数のライン アイテムにわたって繰り返す場合、それらを別のライン アイテムに分割した方が依然としてパフォーマンスが向上する可能性があります。最適な構成を決定するために、常に複雑さ (計算方式)、計算負荷、データが入力されているセルの数をモニタリングしてください。

対象となるエンジン: Classic Hyperblock と Polaris

テキスト文字列の扱いには注意してください。 複数の結合は避け、共通の結合を分割してライン アイテムを分離してください。テキストを結合する場合は IF ISBLANK() を使用してください。文字列が空の場合は BLANK に設定します。

テキスト文字列の結合が必要な場合は、最初に小さなリストに結合を作成することで、テキスト文字列のサイズを最小限に抑えてください。

A - B = 0 よりも A = B を確認する方が常に時間が短くて済みます。この最適化は、数値形式のライン アイテムを比較する場合に特化して適用される点に注意してください。

対象となるエンジン: Classic Hyperblock と Polaris
ブール値が占めるスペースは数値の 8 分の 1 で済みます。計算で数値が明確に必要とされる場合を除き、1 や 0 の代わりに TRUE や FALSE を使用するようにしてください。
対象となるエンジン: Classic Hyperblock のみ

同じ式のなかで SUM と LOOKUP を組み合わせて使用​​しないでください。この組み合わせは、計算エンジンに膨大な数の計算を行わせるとともに、特に時間がディメンションである場合や、ソースとターゲットの構造が異なる場合に、低速な中間リレーションシップ マッピングを生むことになります。計算サイズを大幅に削減し、パフォーマンスを最適化するには、SUM 演算と LOOKUP 演算を常に別々のモジュールとライン アイテムに分割する必要があります。
対象となるエンジン: Classic Hyperblock と Polaris

これらの集計方法を使用して、追加のライン アイテムや IF ステートメントの使用を最小限に抑えます。
対象となるエンジン: Classic Hyperblock のみ
計算に必要なセル数が増える可能性があるため、タイムスケールが長い場合やセル数が多い場合は、CUMULATE() 関数よりも PREVIOUS() 関数を使用する方が高速です。以下の式を使用します: 'Calc line item' = 'data line item' + PREVIOUS('Calc line item') rather than CUMULATE('data line item')
対象となるエンジン: Classic Hyperblock と Polaris
2.02-10a 短いタイムスケール期間の数が少ない場合 (粒度が年で年数が少ない) は CUMULATE の方が高速です。

TEXTLIST() は計算に大量のメモリを必要とするため、可能であれば使用を避けてください。代わりに、2 次元モジュールと ANY を指定したブール フラグを使用することをおすすめします。 FIRSTNONBLANK と LASTNONBLANK を使用する方法もあります。

式内で特定のリスト アイテムを直接参照することは避けてください (例: IF ITEM(list)=list.xx)。代わりに、ロジックを制御するためのブール値形式ライン アイテムがあるシステム SYS モジュールを作成してください。このベスト プラクティスにより式がより動的なものとなり、手動での式の更新を必要とせずに複数のメンバーが同一のロジックを活用できるようになるほか、モデル全体の保守性も向上します。
対象となるエンジン: Classic Hyperblock と Polaris

OFFSET、LAG、又は MOVINGSUM の方が効率的であるため、シンプルなデータ オフセットには POST を使用しないでください。

可能な限り、SELECT 関数で値をハードコーディングすることは避けてください。代わりに、定数モジュールと LOOKUP 関数を使用してそれらを参照してください。
対象となるエンジン: Classic Hyperblock
2.02-14a バージョンバージョンには SELECT を使用しても構いません。
2.02-14b リストのトップ レベル アイテムSELECT を使用してリストのトップ レベル アイテムを参照しても構いません。 他のアイテム (実際のリスト メンバー) については、偽の親リストと追加モジュールを使用することをおすすめします。

空白を返す前にエンジンでリスト全体を走査することになるため、空白の値に対して FINDITEM() を実行すると効率が低下します。計算パフォーマンスを最適化するには、データの密度を評価し、条件付きロジックを使用して空白をバイパスするようにします。 

データの大半が空白である場合は ISBLANK を使用してチェックします: IF ISBLANK(Line Item) THEN BLANK ELSE FINDITEM(List, Line Item) 

データの大半が入力されている場合は ISNOTBLANK を使用してチェックします: IF ISNOTBLANK(Line Item) THEN FINDITEM(List, Line Item) ELSE BLANK。最も一般的な条件を最初に記述することで、エンジンの処理が高速化されます (Classic)。 

ソース ライン アイテムに空白が含まれることが決してない場合: 条件付きチェックを完全に省略して FINDITEM() を使用できます。
対象となるエンジン: Classic Hyperblock のみ

複数の条件ステートメントに条件を含めて、条件が満たされた場合に式内でそれ以上参照されないようにしてください。

IF/THEN ステートメントを含む式を作成する際は、「最も当てはまる」条件を式の最初に記述してください。これにより、「早期終了」動作が可能になります。エンジンは最初に真となる条件に達した時点で式の評価を停止するため、可能な限り早期に計算を終了させることで計算負荷が軽減されます。
対象となるエンジン: Classic Hyperblock

複数の計算を別々のライン アイテムに分割すると、エンジンの動作効率が上がります。そのため、数式が複数ある場合には可能な限り分割してください。何度も参照される計算や頻繁に変更されることがない計算でこれが特に重要になります。

必要以上に依存関係が作成されるのを避けるために、可能であれば常に最終的なソースを参照してください。 こうすることで、より多くの並列計算を実行できるようになり、効率が向上し計算が高速になります。

RANK は計算の負荷が高い式であり、マルチスレッド化できません。 大規模なリストと組み合わせて使用​​すると、計算のパフォーマンスが低下する可能性があります。 RANKCUMULATE についても同様です。

エンジンが各時間軸に対して不必要に計算を重複して実行することになるため、時間に適用されるライン アイテムでは TIMESUM 式を使用しないでください。

代替策:

ローリング合計または累計の場合:MOVINGSUM か YEARTODATE を使用します。

タイムスケール全体の合計の場合:Line Item[Select: Time. All Periods] を使用します。
対象となるエンジン: Classic Hyperblock と Polaris