式に関連する Planual のルール
2.02-01 ネストされた IF
IF を複数回使用しないでください。 数式を複数のライン アイテムに分割し、LOOKUP か代替の構造を使用することをおすすめします。
bestPracticesArticles
2.02-02 数式内の式は 12 個未満
数式の動作を説明するのに一つの簡単な文よりも長くかかる場合、それはおそらく長すぎます。 式が複雑にならないようにしてください。
2.02-03 繰り返される式の使用を慎重に評価する
Classic Hyperblockでは、計算が一度だけ行われるように、繰り返される式を個別のライン アイテムに分割してください。 対象となるエンジン: Classic Hyperblock と Polaris |
2.02-04 テキスト文字列
テキスト文字列の扱いには注意してください。 複数の結合は避け、共通の結合を分割してライン アイテムを分離してください。テキストを結合する場合は IF ISBLANK() を使用してください。文字列が空の場合は BLANK に設定します。
relatedToRule
2.02-05 最も小さい階層に「結合」を作成する
テキスト文字列の結合が必要な場合は、最初に小さなリストに結合を作成することで、テキスト文字列のサイズを最小限に抑えてください。
relatedToRule
bestPracticesArticles
2.02-06 ゼロかどうかを判定する際は、算術演算ではなく論理演算子を使用して数値を比較する
| A - B = 0 よりも A = B を確認する方が常に時間が短くて済みます。この最適化は、数値形式のライン アイテムを比較する場合に特化して適用される点に注意してください。 対象となるエンジン: Classic Hyperblock と Polaris |
2.02-07 1 や 0 の代わりにブール値を使用する
| ブール値が占めるスペースは数値の 8 分の 1 で済みます。計算で数値が明確に必要とされる場合を除き、1 や 0 の代わりに TRUE や FALSE を使用するようにしてください。 対象となるエンジン: Classic Hyperblock のみ |
2.02-08 SUM と LOOKUP の組み合わせを避ける
同じ式のなかで SUM と LOOKUP を組み合わせて使用しないでください。この組み合わせは、計算エンジンに膨大な数の計算を行わせるとともに、特に時間がディメンションである場合や、ソースとターゲットの構造が異なる場合に、低速な中間リレーションシップ マッピングを生むことになります。計算サイズを大幅に削減し、パフォーマンスを最適化するには、SUM 演算と LOOKUP 演算を常に別々のモジュールとライン アイテムに分割する必要があります。
対象となるエンジン: Classic Hyperblock と Polaris
bestPracticesArticles
2.02-09 集計ルール (ANY、ALL、FIRSTNONBLANK、LASTNONBLANK) を利用する
| これらの集計方法を使用して、追加のライン アイテムや IF ステートメントの使用を最小限に抑えます。 対象となるエンジン: Classic Hyperblock のみ |
2.02-10 CUMULATE ではなく PREVIOUS を使用する
| 計算に必要なセル数が増える可能性があるため、タイムスケールが長い場合やセル数が多い場合は、CUMULATE() 関数よりも PREVIOUS() 関数を使用する方が高速です。以下の式を使用します: 'Calc line item' = 'data line item' + PREVIOUS('Calc line item') rather than CUMULATE('data line item') 対象となるエンジン: Classic Hyperblock と Polaris |
exception
| 2.02-10a 短いタイムスケール | 期間の数が少ない場合 (粒度が年で年数が少ない) は CUMULATE の方が高速です。 |
bestPracticesArticles
2.02-11 TEXTLIST() の使用は避ける
TEXTLIST() は計算に大量のメモリを必要とするため、可能であれば使用を避けてください。代わりに、2 次元モジュールと ANY を指定したブール フラグを使用することをおすすめします。 FIRSTNONBLANK と LASTNONBLANK を使用する方法もあります。
2.02-12 リスト メンバーへの参照をハードコーディングしない
| 式内で特定のリスト アイテムを直接参照することは避けてください (例: IF ITEM(list)=list.xx)。代わりに、ロジックを制御するためのブール値形式ライン アイテムがあるシステム SYS モジュールを作成してください。このベスト プラクティスにより式がより動的なものとなり、手動での式の更新を必要とせずに複数のメンバーが同一のロジックを活用できるようになるほか、モデル全体の保守性も向上します。 対象となるエンジン: Classic Hyperblock と Polaris |
bestPracticesArticles
2.02-13 特定の目的にのみ POST を使用する
OFFSET、LAG、又は MOVINGSUM の方が効率的であるため、シンプルなデータ オフセットには POST を使用しないでください。
2.02-14 SELECT の使用を避ける
| 可能な限り、SELECT 関数で値をハードコーディングすることは避けてください。代わりに、定数モジュールと LOOKUP 関数を使用してそれらを参照してください。 対象となるエンジン: Classic Hyperblock |
exception
| 2.02-14a バージョン | バージョンには SELECT を使用しても構いません。 |
| 2.02-14b リストのトップ レベル アイテム | SELECT を使用してリストのトップ レベル アイテムを参照しても構いません。 他のアイテム (実際のリスト メンバー) については、偽の親リストと追加モジュールを使用することをおすすめします。 |
relatedToRule
bestPracticesArticles
2.02-15 空白の値に対して FINDITEM を使用することは避ける
空白を返す前にエンジンでリスト全体を走査することになるため、空白の値に対して 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() を使用できます。 |
relatedToRule
2.02-16 条件を使用して不必要な計算を停止する
複数の条件ステートメントに条件を含めて、条件が満たされた場合に式内でそれ以上参照されないようにしてください。
2.02-17 IF/THEN 式では最も頻繁に出現する条件を先頭に配置する
| IF/THEN ステートメントを含む式を作成する際は、「最も当てはまる」条件を式の最初に記述してください。これにより、「早期終了」動作が可能になります。エンジンは最初に真となる条件に達した時点で式の評価を停止するため、可能な限り早期に計算を終了させることで計算負荷が軽減されます。 対象となるエンジン: Classic Hyperblock |
2.02-18 式の分割
複数の計算を別々のライン アイテムに分割すると、エンジンの動作効率が上がります。そのため、数式が複数ある場合には可能な限り分割してください。何度も参照される計算や頻繁に変更されることがない計算でこれが特に重要になります。
bestPracticesArticles
2.02-19 データはデイジーチェーン接続しない
必要以上に依存関係が作成されるのを避けるために、可能であれば常に最終的なソースを参照してください。 こうすることで、より多くの並列計算を実行できるようになり、効率が向上し計算が高速になります。
bestPracticesArticles
2.02-20 大規模なリストでは RANK 式を使用しない
RANK は計算の負荷が高い式であり、マルチスレッド化できません。 大規模なリストと組み合わせて使用すると、計算のパフォーマンスが低下する可能性があります。 RANKCUMULATE についても同様です。
2.02-21 時間には TIMESUM を使用しない
| エンジンが各時間軸に対して不必要に計算を重複して実行することになるため、時間に適用されるライン アイテムでは TIMESUM 式を使用しないでください。 代替策: ローリング合計または累計の場合:MOVINGSUM か YEARTODATE を使用します。 タイムスケール全体の合計の場合: Line Item[Select: Time. All Periods] を使用します。対象となるエンジン: Classic Hyperblock と Polaris |