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