算式の使用
データベース・アウトラインで式を慎重に使用すると、計算パフォーマンスが大幅に向上する可能性があります。 たとえば、計算スクリプトに式を配置するのではなく、データベース・アウトラインのメンバーに式を配置することで、計算パフォーマンスを向上させることができます。 「ブロック・ストレージ・データベースの式の開発」を参照してください。
次の各項では、パフォーマンスに影響するFormulaの問題の処理方法について説明します。
統合
データベース・アウトラインを使用して値をロールアップする方が、式を使用して値を計算するよりも効率的です。 たとえば、次の式をメンバー100に適用するよりも、メンバー100-10、100-20および100-30をメンバー100に連結する方が効率的です:
100-10 + 100-20 + 100-30
図33-1 連結の例

単純な式の使用
単純な式を使用し、ブロック・サイズが異常に大きい場合は、計算のパフォーマンスに大きな影響を与えることなく、疎ディメンションまたは密ディメンションのメンバーに式を配置できます。 ブロック・サイズが大きいほど、単純な式が計算パフォーマンスに与える影響が大きくなります。 ブロック・サイズと計算パフォーマンスの関係については、「ブロック・サイズおよびブロック密度」を参照してください。
単純な式は、比率やパーセンテージなどで、次の要件を満たしています:
-
別のディメンション(疎または密)の値を参照しません。 たとえば、単純な式はProduct -> Janを参照できません。
-
範囲関数を使用しません。 たとえば、単純な式では、@AVGRANGE、@MAXRANGE、@MINRANGEまたは@SUMRANGEを使用できません。
-
関係または財務機能を使用しません。 たとえば、単純な式では、@ANCESTVAL、@NEXT、@PARENTVAL、@SHIFT、@ACCUMまたは@GROWTHを使用できません。
式が計算パフォーマンスに与える影響の詳細は、「ボトムアップおよびトップダウンの計算」を参照してください。
複雑な算式の使用
複雑な式を使用する場合は、次のガイドラインを適用してパフォーマンスを向上させることができます:
-
可能な場合は、denseディメンションのメンバーに式を適用します。
-
必要なデータ・ブロックのみを計算する計算スクリプト内の「FIXコマンドの使用」。
-
データベースのdensityを増やします(既存のデータ・ブロックと使用可能なデータ・ブロックの比率)。
複雑な式は、次のいずれかの要件を満たす式です:
-
Product -> Janなど、別のディメンション(疎または密)のメンバーを参照します。
-
@AVGRANGE、@MAXRANGE、@MINRANGE、@SUMRANGEなど、1つ以上の範囲関数を使用します。
-
関係または財務機能(@ANCESTVAL、@NEXT、@PARENTVAL、@SHIFT、@ACCUM、@GROWTHなど)を使用します。
疎ディメンション・メンバーに適用すると、複雑な式によってより多くの計算オーバーヘッドが発生するため、パフォーマンスが低下します。 この問題が発生するのは、複雑な式が存在する場合、その式を持つメンバーに関連する可能性のあるすべてのデータ・ブロックおよび既存のすべてのデータ・ブロックに対してEssbaseで計算を実行する必要があるためです。 疎ディメンション・メンバーに関係または財務関数が存在すると、Essbaseは可能性のあるすべてのブロックおよび既存のブロックに対して計算を実行し、オーバーヘッドをさらに増加させます。
したがって、関係または財務関数を含む複雑な式では、関係または財務関数を含まない複雑な式よりもオーバーヘッドが増加します。
複雑な式が計算のパフォーマンスに与える影響の詳細は、「ボトムアップおよびトップダウンの計算」を参照してください。
次の2つの例は、複雑なformulaオーバーヘッドを示しています:
-
データベースに90個の既存のデータ・ブロックと100個の潜在的なデータ・ブロックがある場合、複雑な式のオーバーヘッドは大きくなく、10個を超える余分なブロックが読み取られたり、値が書き込まれる可能性があります。
-
データベースに10個の既存のデータ・ブロックと100個の潜在的なデータ・ブロックがある場合、オーバーヘッドは複雑な式がない場合(アウトライン構造やその他のファクタによって異なります)、読取りおよび書込みの対象となる余分なブロックは最大10倍になります。
すべての場合において、既存のデータ・ブロックと使用可能なデータ・ブロックの比率が低いほど、計算パフォーマンスのオーバーヘッドが高くなり、パフォーマンスが低下します。
大規模データベース・アウトラインの疎ディメンションの式の最適化
SET FRMLBOTTOMUP計算コマンドを使用して、大規模なデータベース・アウトラインの疎ディメンションの式の計算を最適化できます。 このコマンドを使用すると、他の方法ではトップダウンで計算される疎メンバー式にボトムアップ計算を強制できます。 「ボトムアップ計算の強制」を参照してください。
トップダウン式でボトムアップ計算を強制すると、CALC ALLおよびCALC DIMコマンドを効率的に使用できます。 SET FRMLBOTTOMUP計算コマンドおよびCALCOPTFRMLBOTTOMUP構成設定の説明を確認します。
疎ディメンションのメンバーに割り当てられた定数値
疎ディメンションのメンバーに定数を割り当てると、Essbaseでは、そのメンバーを含む疎ディメンション・メンバーのすべての組合せに対してデータ・ブロックが自動的に作成されます。
たとえば、メンバーまたは計算スクリプトの式に次の式が含まれているとします:
California = 120;
この式で、Californiaは疎ディメンションのメンバーで、120は定数値です。 Essbaseでは、Californiaに対して使用可能なすべてのデータ・ブロックが自動的に作成され、値120がすべてのデータ・セルに割り当てられます。 多数のデータ・ブロックを作成できます。 パフォーマンスを向上させるには、不要な値を作成しないFormulaを作成します。
疎ディメンションの定数を、値を必要とする交差にのみ割り当てるには、次の例のようにFIXを使用します:
FIX(Colas,Misc,Actual)
California = 120;
ENDFIX
この例では、Colasは疎ディメンションProductのメンバー、Actualは密ディメンションScenarioのメンバー、Miscは密ディメンションMeasuresのメンバーです。 値120は、スクリプトで年の特定のメンバーが指定されていないため、California (Marketディメンション)、Actual (Scenarioディメンション)、Misc (Measuresディメンション)、Colas (Productディメンション)およびYearディメンションの任意のメンバーの交差に割り当てられます。
Sample.Basicには疎ディメンションが2つしか含まれていないため、この例は1つのブロックにのみ影響します。 疎ディメンションがさらに存在する場合、Essbaseでは疎ディメンションのすべての組合せのデータ・ブロックがCaliforniaおよびColasと保証され、必要に応じてブロックが作成されます。 新しいブロック内で、Essbaseはメジャーおよびシナリオの値(値120が割り当てられている値以外)を#MISSINGに設定します。
疎ディメンションのメンバーに割り当てられた非定数値
疎ディメンションのメンバーに非定数値を割り当てると、等式のブロックの作成設定に基づいてブロックが作成されます。 等式のブロックの作成設定は、データベース・プロパティとしてデータベース・レベルで定義されます。 (「定数でない値」を参照。)
計算スクリプト内で、等式のブロックの作成設定を一時的に上書きできます。 Westに値がなく、等式にブロックを作成が有効になっている場合は、次の計算の影響を考慮してください:
West = California + 120;
Westのすべての子に対して対応するブロック値が#MISSINGであっても、Westとのすべての疎メンバー交差に対して不要なブロックが作成される場合があります。 特に大規模なデータベースでは、不要なブロックの作成および処理には追加の処理時間が必要です。
疎ディメンションのメンバーに非定数値を割り当てるときのブロックの作成を制御するには、次のスクリプトに示すように、SET CREATEBLOCKONEQ ON | OFF計算コマンドを使用します:
FIX (Colas);
SET CREATEBLOCKONEQ OFF
West = California + 120;
SET CREATEBLOCKONEQ ON
East = “New York” + 100;
ENDFIX
等式のブロックを作成設定はスクリプトの先頭で無効になっているため、WestブロックはWestの子の値が存在する場合にのみ作成されます。 後で、等式のブロックを作成設定が有効になっているため、Eastのすべてのブロックが作成されます。
ノート:
SET CREATEBLOCKONEQを使用すると、このコマンドを含む計算スクリプトの実行中のブロックの作成にのみ影響します。 このコマンドでは、方程式のブロックの作成のデータベース全体の設定は変更されません。
ディメンション間演算子の使用
ディメンション間演算子(->)を使用する場合は、次の状況に注意してください:
方程式の左側
計算スクリプトのパフォーマンスを向上させるには、計算スクリプトでFIXを使用して、式の左側にディメンション間演算子を含む式ではなく、式の使用を修飾します。
たとえば、Sample.BasicのJan -> Salesの値を5%増やすとします。 関連するメンバーの組合せのみを計算してパフォーマンスを向上させるには、FIXコマンドを使用します:
FIX(Jan)
Sales = Sales * .05;
ENDFIX
FIXコマンドを使用すると、Essbaseは、指定されたメンバーの組合せ(この例では、Janを含む組合せ)に対してのみ式を計算します。
この方法を、緩やかなディメンション間演算子の使用方法と比較してください。 前の例では、データベース・アウトラインのSalesメンバーに次の式を配置しました:
Sales(Sales -> Jan = Sales -> Jan * .05;)
Essbaseはデータベースを循環しながら、時間としてタグ付けされたディメンション(Jan、Feb、Marなど)のメンバーを含むすべてのメンバーの組合せの式を計算しますが、計算する必要があるのはJanuaryの組合せのみです。
「FIXコマンドの使用」を参照してください。
密ディメンションの方程式
密ディメンションの方程式でディメンション間演算子を使用する場合、次の両方の条件が当てはまると、Essbaseでは必要なブロックが自動的に作成されません:
-
結果の値は密ディメンションの値です。
-
オペランドは疎ディメンションのものです。
次の方法を使用してブロックを作成し、パフォーマンスの問題を回避できます。
-
結果メンバーが密ディメンションからではなく疎ディメンションからのものであることを確認します。 この例では、結果メンバーBudgetは疎ディメンションのものです:
FIX(Sales) Budget = Actual * 1.1; ENDFIX FIX(Expenses) Budget = Actual * .95; ENDFIX
-
DATACOPY計算コマンドを使用して、必要なブロックを作成し、計算します。 「DATACOPYを使用した既存のブロックのコピー」を参照してください。
-
密メンバー式を含むメンバー式を使用します:
FIX(Sales, Expenses) Budget (Sales = Sales -> Actual * 1.1; Expenses = Expenses -> Actual * .95;) ENDFIX
フォーミュラ実行レベルの管理
ブロック・ストレージ・アウトライン内の式は、1つ以上のブロック内で式のネストされた実行を引き起こすように相互に依存関係を持つことができます。 このような数式は再帰数式と呼ばれます。 再帰的な式によってループが大きくなったり、ループが展開されてサーバーが異常終了する場合があります。
異常終了を回避するために、CALCLIMITFORMULARECURSION構成設定を使用して、デフォルトの実行レベル数を超えるformula実行を停止できます。