3 計算式、モデル、集計および割当て
計算オブジェクトは、実行する分析を指定するOLAP DML文を含むOLAP DMLオブジェクトです。計算オブジェクトには、計算式、モデル、集計仕様、割当て仕様およびプログラムが含まれます。
この章では、次の項目について説明します。
OLAP DMLプログラムの作成の詳細は、「OLAP DMLプログラム」を参照してください。
計算オブジェクトの作成
計算仕様オブジェクトを作成する一般的な手順は、次の2つのステップです。
-
適切なDEFINE文を使用して、計算オブジェクトを定義します。
-
オブジェクト定義に計算仕様を追加します。計算仕様は、次の方法で計算オブジェクトの定義に追加できます。
-
入力ファイル内であれば、OLAP Worksheetのコマンドライン・レベルまたはPL/SQLファンクションの引数として追加します。この場合、オブジェクトが現行のオブジェクトであることを確認し(必要な場合はCONSIDER文を発行します)、複数行のテキスト引数として仕様を含む適切な文を発行します。仕様を複数行のテキストとしてコーディングするには、JOINLINESファンクションを使用できますが、ここでJOINLINESの各テキスト引数は必要な処理を指定する文となり、最後の文は
END
になります。 -
OLAP Worksheetの編集ウィンドウで追加します。この場合、OLAP Worksheetのコマンドライン・レベルで、適切なキーワードを指定してEDIT文を発行します。EDIT文を実行すると、指定したオブジェクトの編集ウィンドウが開きます。その後、編集ウィンドウで各文を個別の行として入力します。完了したら、仕様を保存して編集ウィンドウを閉じます。
-
次の表は、各計算仕様を作成するための主なOLAP DML文を示したものです。
表3-1 計算オブジェクトを定義するコマンド
計算 | 定義文 | 仕様文 | 詳細の参照先 |
---|---|---|---|
計算式 |
DEFINE FORMULA |
EQ |
|
モデル |
DEFINE MODEL |
MODEL |
|
集計 |
DEFINE AGGMAP |
AGGMAP |
|
割当て |
DEFINE AGGMAP |
ALLOCMAP |
|
プログラム |
DEFINE PROGRAM |
PROGRAM |
OLAP DML計算式
式は計算式として保存できます。多くの場合、式の使いやすさと記憶領域の節約のために計算式を定義します。式の計算式を定義すると、式を示す計算式の名前を使用できます。Oracle OLAPでは、計算式のデータは変数に保存せず、要求されるたびに、実行時にデータを計算します。
計算式を作成する前に、最初に計算式オブジェクトを定義する際に式を指定するか、または計算式オブジェクトを定義した後に計算式の式を指定するかを次のように決定します。
-
最初に計算式オブジェクトを定義する際に式を指定するには:
-
DEFINE FORMULA文を発行して、計算式オブジェクトを定義します。定義に式を含めます。
datatype
またはdimensions
引数の値は指定しないでください。 -
(オプション)COMPILE文を発行して、計算式をコンパイルします。
-
計算式をアナリティック・ワークスペースの中で永続化する場合は、UPDATE文およびCOMMIT文を順に実行して、計算式を保存します。
-
-
計算式オブジェクトを定義した後に計算式の式を指定するには:
-
DEFINE FORMULA文を発行して、計算式オブジェクトを定義します。
datatype
またはdimensions
引数の値を指定し、式自体の値は指定しないでください。 -
CONSIDER文を発行して計算式を現行の定義にし、さらにEQ文を発行して計算式の式を指定します。
-
(オプション)COMPILE文を発行して、計算式をコンパイルします。
-
計算式をアナリティック・ワークスペースの中で永続化する場合は、UPDATE文およびCOMMIT文を順に実行して、計算式を保存します。
-
たとえば、次のような計算式を定義してドルの売上高を計算できます。
DEFINE dollar.sales FORMULA units * price
TRACEを使用すると、計算式をデバッグできます。
OLAP DMLモデル・オブジェクト
この項では、OLAP DMLモデルの作成および実行について説明します。内容は次のとおりです。
OLAP DMLモデルの概要
OLAP DMLモデルは、変数またはディメンション値に結果を割当て可能な、相互に関連する一連の方程式です。たとえば、財務モデルでは、gross.margin
またはnet.income
などの特定の明細項目に値を割り当てることができます。
gross.margin = revenue - cogs
代入文がデータをディメンション値に割り当てるか、またはその計算でディメンション値を参照する場合、ディメンションベースの方程式と呼ばれます。ディメンションベースの方程式は、ディメンション自体は参照せず、ディメンションの値のみを参照します。そのため、モデルにディメンションベースの方程式が含まれている場合、モデルの先頭でDIMENSION
文を使用し、それらの各ディメンションの名前を指定する必要があります。
モデルにディメンションベースの方程式が含まれている場合、モデルを実行する際にソリューション変数の名前を指定する必要があります。ソリューション変数は、データのソースであるとともにモデルの方程式の代入ターゲットでもあります。この変数により、ディメンションベースの方程式で使用される入力データが保持され、計算された結果はソリューション変数の指定された値に格納されます。たとえば、line
ディメンションに基づく財務モデルを実行する場合、ソリューション変数としてactual
を指定できます。
ディメンションベースの方程式により、財務モデリングに柔軟性が提供されます。モデルを解決するまでモデリング変数を指定する必要がないため、actual
変数、budget
変数、またはline
によってディメンション化された任意の変数で同じモデルを実行できます。
モデルは非常に複雑になる場合があります。次のことができます。
-
1つのモデルを別のモデルに含めます(「モデルのネスト」を参照)。
-
異なる時間間隔からのデータを使用します(「過去および将来の時間間隔からのデータの使用」を参照)。
-
連立方程式を解決します(「連立方程式の解決」を参照)。
-
異なるシナリオのモデルを作成します(「複数のシナリオのモデリング」を参照)。
モデルの作成
OLAP DMLモデルを作成するには、次の手順を実行します。
- DEFINE MODELコマンドを発行して、プログラム・オブジェクトを定義します。
- モデルに仕様を追加するMODELコマンドを発行して、実行する処理を指定します。
- モデルをコンパイルします(「モデルのコンパイル」を参照)。
- (オプション)必要な場合は、モデル・オプションの設定を変更します(「モデル・オプション」のリストを参照)。
- モデルを実行します(「モデルの実行」を参照)。
- モデルをデバッグします(「モデルのデバッグ」を参照)。
- モデルをアナリティック・ワークスペースの中で永続化する場合は、UPDATEコマンドおよびCOMMITコマンドを順に実行して、モデルを保存します。
モデルの作成の例は、例10-57を参照してください
モデルのネスト
MODELコマンド内でINCLUDE文を使用して、1つのモデルを別のモデルに含めることができます。INCLUDE文を含むMODELコマンドは、 親モデルと呼ばれます。含められているモデルは、ベース・モデルと呼ばれます。INCLUDE文をベース・モデルで使用することにより、モデルをネストできます。たとえば、モデルmyModel1
がモデルmyModel2
を含み、モデルmyModel2
がモデルmyModel3
を含むことが可能です。ネストしたモデルは階層形式になります。この例では、myModel1
が一番上の階層になり、myModel3
がルートになります。
モデルにINCLUDE文が含まれる場合、DIMENSION文を含めることはできません。親モデルは、含まれる階層のルート・モデルのDIMENSION文からそのディメンションを継承します(存在する場合)。前述の例では、モデルmyModel1
およびmyModel2
は、どちらもモデルmyModel3
のDIMENSION文からそのディメンションを継承します。
INCLUDE文により、モジュール・モデルの作成が可能になります。特定の方程式が複数のモデルで共通している場合、それらの方程式を独立したモデルに配置して、必要に応じてそのモデルの他のモデルに含めることができます。
さらに、INCLUDE文によりwhat-if分析が容易になります。実験的なモデルでは、ベース・モデルから方程式を流用し、それを選択的に新しい方程式に置き換えることが可能です。what-if分析をサポートするには、モデルで方程式を使用して以前の方程式をマスクします。以前の方程式は、同じモデルまたはそれに含まれているモデルにあります。マスクされた方程式は実行されず、モデルのMODEL.COMPRPTレポートにも表示されません。
ディメンション・ステータスおよびモデル方程式
ディメンション値にデータを割り当てる代入文がモデルに含まれている場合、ディメンションは一時的にその値に制限され、計算を実行してディメンションの初期ステータスをリストアします。
たとえば、モデルには次の文が含まれる場合があります。
DIMENSION line gross.margin = revenue - cogs
モデルを実行する際にソリューション変数としてactual
を指定すると、次のコードが構成され、実行されます。
PUSH line LIMIT line TO gross.margin actual = actual(line revenue) - actual(line cogs) POP line
モデルでソリューション変数を使用することにより、このような自動的なコード構成が行われるため、単純なモデル方程式で複雑な計算を実行できます。たとえば、明細項目データは、line
によってディメンション化されたactual
変数に格納されます。ただし、明細項目の詳細データは、detail.line
という名前のディメンションを持つdetail.data
という変数に格納される場合があります。
各詳細項目に関連する明細項目を指定するline
とdetail.line
間のリレーションが、アナリティック・ワークスペースに含まれる場合、次のようなモデル方程式を記述できます。
revenue = total(detail.data line) expenses = total(detail.data line)
detail.line
とline
間のリレーションは、詳細データを適切な明細項目に集計するために自動的に使用されます。モデルの実行時に構成されるコードにより、適切な合計が確実にline
ディメンションの各値に割り当てられます。たとえば、revenue
項目の方程式が計算される際、line
は一時的にrevenue
に制限され、TOTAL
ファンクションはline
のrevenue
値に対する詳細項目の合計を返します。
過去および将来の時間間隔からのデータの使用
いくつかのOLAP DMLファンクションにより、過去または将来の時間間隔のデータを使用することが容易になります。たとえば、LAG
ファンクションは指定した過去の時間間隔のデータを返し、LEAD
ファンクションは指定した将来の時間間隔のデータを返します。
その計算で過去または将来のデータを使用するモデルを実行する場合、ソリューション変数に必要な過去または将来のデータが含まれていることを確認する必要があります。たとえば、モデルには、先月のrevenue
明細項目に基づいて今月のrevenue
明細項目の推定値を求める代入文が含まれていることがあります。
DIMENSION line month ... revenue = LAG(revenue, 1, month) * 1.05
モデルを実行するときにmonth
ディメンションがApr2004
からJun2004
に制限されている場合、ソリューション変数にMar96
のrevenue
データが含まれていることを確認する必要があります。
モデルにLEAD
ファンクションが含まれている場合、ソリューション変数には必要な将来のデータが含まれている必要があります。たとえば、2004年4月から6月までのデータを計算するときに、モデルが1か月先からデータを取得する場合、モデルの実行時にはソリューション変数に2004年7月のデータが含まれている必要があります。
モデルにおけるNA値の処理
Oracle OLAPは、モデルの方程式を評価する際にNASKIP2オプションに従います。NASKIP2は、+
(加算)および-
(減算)演算が実行される際のNA
値の処理方法を制御します。ソリューション変数にNA
値が含まれている場合、NASKIP2の設定は重要です。
計算の結果は、ソリューション変数に入力として使用されるNA
値が含まれている場合のみではなく、連立方程式のターゲットがNA
の場合もNA
になる可能性があります。ソリューション変数の値は、連立ブロックでの最初の反復におけるターゲットの初期値として使用されます。そのため、ソリューション変数にターゲットの初期値としてNA
が含まれる場合、最初の反復の結果としてNA
が生成され、そのNA
の結果が続いて起こる反復の間、保持されることがあります。
結果がNA
になるのを回避するには、ソリューション変数にNA
値が含まれていないことを確認するか、NASKIP2をYES
に設定してからモデルを実行します。
連立方程式の解決
連立方程式を解くには、反復解法を使用します。各反復では、値が各方程式で計算されます。新しい値が前回の反復の値と比較されます。比較が指定された許容範囲内になると、方程式は収束したと判断されます。比較が指定された限界を超える場合、方程式は発散したと判断されます。
ブロック内のすべての方程式が収束する場合、そのブロックは解決したと判断されます。方程式が発散した場合、または指定された反復の回数で収束しなかった場合、ブロック(およびモデル)の解決は失敗し、エラーが発生します。
連立方程式の解を制御するには、OLAP DMLオプションを使用できます(「モデル・オプション」を参照)。たとえば、これらのオプションを使用して、使用する解決の方法、収束および発散のテストで使用する要素、実行する反復の最大回数、および代入文が発散した場合や収束に失敗した場合に行う処理を指定できます。
複数のシナリオのモデリング
月および部門について単一の数値セットを計算するかわりに、それぞれ異なる条件に基づいた複数の数値セットを計算する場合があります。
異なる入力値セットに基づいて予測または予算額を計算および格納する、シナリオ・モデルを定義できます。たとえば、楽観値、悲観値および最良予測値に基づいて利益を計算できます。
シナリオ・モデルを作成するには:
-
シナリオ・ディメンションを定義します。
-
シナリオ・ディメンションによってディメンション化されるソリューション変数を定義します。
-
ソリューション変数に入力データを入力します。
-
入力データに基づいて結果を計算するモデルを作成します。
シナリオ・モデルの作成の例は、例10-58を参照してください
モデルのコンパイル
モデルの文を記述した後、COMPILEコマンドを使用してモデルをコンパイルします。コンパイル中、COMPILEはフォーマット・エラーをチェックするため、COMPILEを使用してコードをデバッグしてからモデルを実行できます。モデルを実行する前にCOMPILEを使用しない場合、モデルは自動的にコンパイルされてから解決されます。ISCOMPILEDを選択してOBJファンクションを使用することで、モデルがコンパイルされているかどうかをテストできます。
SHOW OBJ(ISCOMPILED 'myModel')
COMPILE文の使用またはモデルの実行によりモデルをコンパイルすると、モデル・コンパイラではモデル特有の問題のチェックが行われます。次のいずれかの場合、エラー・メッセージが表示されます。
-
モデルが、DIMENSION文、INCLUDE文および代入(SET)文以外の文を含んでいる。
-
モデルがDIMENSION文とINCLUDE文の両方を含んでいる。
-
モデル内の最初の方程式の後にDIMENSION文またはINCLUDE文が置かれている。
-
単一のディメンションベースの方程式内のディメンション値が、2つ以上の異なるディメンションを参照している。
-
方程式が参照している名前を、コンパイラが、アタッチされたアナリティック・ワークスペースのオブジェクトとして識別できない。このエラーが発生した場合、方程式でディメンションの値が参照されているにもかかわらず、DIMENSION文にそのディメンションが含まれていない可能性があります。さらに、別のモデルを含むモデルをコンパイルしている際、もう一方のモデルのコンパイルが失敗すると、DIMENSION文が見つからないとされる可能性があります。ルート・モデル(含まれるモデルの階層内で最も深くに位置するモデル)のコンパイルが失敗すると、親モデルはルート・モデルからのDIMENSIONコマンドをまったく継承できません。この場合、エラーの実際の発生箇所がルート・モデルであっても、コンパイラでは親モデルにおけるエラーとしてレポートすることがあります。詳細は、INCLUDEを参照してください。
方程式内の名前の解決
モデル・コンパイラでは、方程式内の各名前を調査して、名前が参照するアナリティック・ワークスペース・オブジェクトを判断します。計算や結果の代入など、モデルの方程式でも変数およびディメンション値を同じ方法で使用できるため、名前は、変数の名前であることもあれば、DIMENSION文にリストされているディメンションの値であることもあります。
各名前参照を解決する際、コンパイラは、明示的または継承されたDIMENSION文にリストされているすべてのディメンションをリスト順で検索し、リストされたディメンションのディメンション値に名前が一致するかどうかを確認します。検索は、一致する値が検出された時点で終了します。
したがって、リストされているディメンションのうち2つ以上のディメンションが同じ名前のディメンション値を持っている場合、コンパイラでは、その値を、DIMENSION文内で最も早く名前が付けられているディメンションに属するものとみなします。
同様に、モデル・コンパイラは、リテラルなINTEGER
値が属するディメンションを誤って解釈することがあります。たとえば、モデル・コンパイラでは、リテラル値'200'
を、200の位置の値またはリテラルなディメンション値200のいずれかを含む最初のディメンションに属するものとみなします。
識別の誤りを回避するため、必要なディメンションを指定して値をカッコおよび一重引用符で囲むことができます。「SET」を参照してください。
コンパイラでは、ある名前がDIMENSION文で指定されているどのディメンションの値でもないことを検出すると、その名前をアナリティック・ワークスペース変数の名前であるとみなします。アタッチされているどのアナリティック・ワークスペースにもその名前の変数が定義されていない場合、エラーが発生します。
ディメンションをループ処理するためのコード
モデル・コンパイラは、文がループ処理するディメンションを決定します。方程式によって結果が変数へ代入されると、コンパイラでは変数のディメンション(またはコンポジットのベース)をループ処理するコードを作成します。
ディメンションベースの方程式を含むモデルを実行する場合、指定するソリューション変数を、DIMENSION文にリストされているディメンションよりも多いディメンションによってディメンション化できます。
プログラム引数の評価
ユーザー定義のプログラムに対する引数としてモデル・ディメンションの値を指定する場合、コンパイラは、この引数によって持ち込まれる依存性を認識します。
たとえば、ある方程式で、一定の条件をテストした後でその条件に基づくTaxes
明細項目を重み付けして返すweight
というプログラムを使用するとします。この例の場合、モデル方程式は次のようなものになります。
Net.Income = Opr.Income - weight(Taxes)
コンパイラでは、Net.Income
がOpr.Income
およびTaxes
に依存することを正しく認識します。ただし、weight
プログラムがプログラム引数として指定されていないディメンション値または変数を参照する場合には、コンパイラは、それらの計算によって持ち込まれる隠れた依存性は認識しません。
方程式間の依存性
モデル・コンパイラでは、モデル内の方程式間の依存性を分析します。1つの方程式内で等号の右側にある式が別の方程式の代入ターゲットを参照する場合に、依存関係が存在します。ある方程式が、方程式間の依存性の結果として、それ自体に間接的に依存している場合は、それらの方程式間には循環依存が存在します。
モデル・コンパイラでは、モデルを複数のブロックに編成し、依存性を反映するようにブロック内の方程式およびブロック自体を順序付けます。モデルが実行されると、モデルは一度に1ブロックずつ解決されます。モデル・コンパイラでは、次に示す3つのタイプのソリューション・ブロックを生成できます。
-
単純ソリューション・ブロック: 単純ブロックには、互いに独立している方程式および相互に非循環的な依存のある方程式が含まれます。
たとえば、ブロックに値
A
、B
およびC
について解く方程式が含まれる場合、非循環的な依存はA>B>C
のように表されます。矢印は、A
がB
に依存し、B
がC
に依存していることを示しています。 -
ステップ・ソリューション・ブロック: ステップ・ブロックには、一方向のディメンションの依存である循環依存を持つ方程式が含まれます。ディメンションの依存関係は、現在のディメンション値のデータが以前または以後のディメンション値からのデータに依存する場合に発生します。ディメンションの依存関係は、データが以前の値のみまたは以後の値のみに依存し、その両方には依存しない場合に一方向となります。一方向のディメンション依存の詳細は、「一方向のディメンション依存の保証」を参照してください。
ディメンションの依存関係は、通常、時間ディメンションで発生します。たとえば、普通、明細項目値は、以前の時間間隔の同じ明細項目または異なる明細項目の値に依存します。ブロックに値
A
およびB
について解く方程式が含まれる場合、一方向のディメンション依存はA>B>LAG(A)
のように表されます。矢印は、A
がB
に依存し、B
が前の時間間隔のA
の値に依存していることを示しています。 -
連立ソリューション・ブロック: 連立ブロックには、一方向のディメンション依存以外の循環依存がある方程式が含まれます。循環依存は、ディメンション修飾子がまったく関与しない場合もあれば、双方向のディメンション依存である場合もあります。双方向のディメンション依存の詳細は、「モデル・コンパイラで双方向のディメンション依存が想定される構造」を参照してください。
モデルに連立方程式のブロックが含まれる場合、COMPILEにより警告メッセージが表示されます。この場合、モデルを実行する前に、連立ソリューションを制御するオプションの設定を確認することもできます。これらのオプションは、「モデル・オプション」にリストされています。
ディメンション修飾子に依存しない循環依存の例は、
A>B>C>A
として表すことができます。矢印は、A
がB
に依存し、B
がC
に依存し、C
がA
に依存していることを示しています。双方向のディメンション依存である循環依存の例は、
A>LEAD(B)>LAG(A)
として表すことができます。矢印は、A
が将来の期間におけるB
の値に依存し、一方、B
は以前の期間におけるA
の値に依存していることを示しています。
連立方程式の順序
方程式の連立ブロックの解決は、方程式の順序に影響されます通常は、モデル・コンパイラが決定する最適な方程式の順序をそのまま受け入れます。ただし、場合によっては、方程式を特定の順序に配置することによって収束を促進できることもあります。
各ブロック内の連立方程式を、指定した順序のままコンパイラによって変更されないようにするには、モデルをコンパイルする前にMODINPUTORDERオプションをYES
に設定します。(MODINPUTORDERは、単純ブロックまたはステップ・ブロック内の方程式の順序には影響しません。)
モデル・コンパイラで双方向のディメンション依存が想定される構造
依存が次のいずれかの構造を介して持ち込まれる場合、モデル・コンパイラでは、双方向のディメンション依存が存在するものとみなします。
-
AVERAGE、TOTAL、ANYまたはCOUNTなどの集計ファンクションを使用する場合、双方向のディメンション依存が発生する可能性があります。
Opr.Income = Gross.Margin - (TOTAL(Marketing + Selling + R.D)) Marketing = LAG(Opr.Income, 1, month)
-
CUMSUM、LAGまたはLEADなどのtime-period引数を必要とする時系列のファンクションを使用する場合(「一方向のディメンション依存の保証」に記述されている特定のファンクションおよび条件を除く)、双方向のディメンション依存が発生する可能性があります。
-
双方向のディメンション依存は、DEPRSLまたはNPVなどの財務ファンクションを使用している場合にも、発生する可能性があります。
融資または減価償却のファンクションを介して持ち込まれた時間ディメンションでの循環依存は、予期しない結果に繋がる場合があります。融資のファンクションには、FINTSCHED、FPMTSCHED、VINTSCHEDおよびVPMTSCHEDがあります。減価償却のファンクションには、DEPRDECL、DEPRDECLSW、DEPRSLおよびDEPRSOYDがあります。
一方向のディメンション依存の保証
方程式間の依存が次のいずれかの構造を介して持ち込まれる場合、一方向のディメンション依存が発生します。
-
LAGまたはLEADファンクションを使用し、時間間隔の番号に対する引数が明示的な数(値または定数)またはABSの結果として表されている場合、一方向のディメンション依存が発生します。(そうでない場合、以前のディメンション値および将来のディメンション値の両方が関与する双方向の依存がある可能性があり、コンパイラによって、連立ソリューションが必要であるとみなされます。)LAGのこの使用例は次のとおりです。
Opr.Income = Gross.Margin - (Marketing + Selling + R.D) Marketing = LAG(Opr.Income, 1, month)
-
一方向のディメンション依存は、MOVINGAVERAGE、MOVINGMAX、MOVINGMINまたはMOVINGTOTALファンクションを使用する場合、start引数とstop引数がゼロ以外の数の場合、およびstart引数とstop引数が両方とも正の数か負の数である場合、発生します。そうでない場合は、双方向のディメンション依存とみなされます。
Opr.Income = Gross.Margin - (Marketing + Selling + R.D) Marketing = MOVINGAVERAGE(Opr.Income, -4, -1, 1, month)
解析結果の取得
モデルのコンパイル後、次のツールを使用して、コンパイラによる解析の結果についての情報を取得できます。
-
MODEL.COMPRPTプログラムは、モデルの方程式がどのようにブロックにグループ化されたかを示すレポートを生成するプログラムです。このレポートでは、ディメンション間の依存があるステップ・ブロックおよび連立ブロックについて、依存に関与するディメンションがリストされます。
-
MODEL.DEPRTプログラムは、各モデル方程式が依存する変数およびディメンション値がリストされるレポートを生成するプログラムです。ディメンションに依存している場合、レポートにはディメンションの名前が示されます。
-
INFOファンクションでは、モデルの構造に関する情報の特定の項目を取得できます。
モデルの実行
-
モデルを実行する前に、ソリューション変数で入力データが使用可能である必要があります。
-
連立方程式のブロックを含むモデルを実行する前に、連立ブロックの解決を制御する一部のOLAP DMLオプションの値を確認または変更できます。これらのオプションは、「モデル・オプション」に簡単な解説があります。
-
モデルにディメンションベースの方程式が含まれる場合、データのソースおよび方程式の結果の割当てターゲットの両方として機能する数値ソリューション変数を指定する必要があります。ソリューション変数は、通常モデル方程式の基となるすべてのディメンションによってディメンション化されますが、方程式の基にしないソリューション変数の他のディメンションによってもディメンション化されます。
-
モデルを実行すると、方程式の基にしないソリューション変数の各ディメンションの現行のステータス・リストにある値が自動的にループ処理されます。
-
モデル方程式が以前の時間間隔からのデータを基に計算を行っている場合、ソリューション変数にはそれらの以前の時間間隔のデータが含まれている必要があります。データが含まれていない場合、またはDAY、WEEK、MONTH、QUARTER、YEAR型のディメンションの最初の値がステータスにある場合、計算の結果は
NA
となります。
モデル実行用の構文
モデルを実行または解決するには、次の構文を使用します。
model-name [solution-variable] [NOWARN]
ここで
-
model-nameはモデルの名前です。
-
solution-variableは、ディメンションベースの方程式を含むモデルで、データのソースおよびターゲットの両方として機能する数値変数の名前です。ソリューション変数は、通常、モデル方程式の基となるすべてのディメンションによってディメンション化されます(明示的に指定するか、DIMENSIONコマンドに含めます)。solution-variable引数は、モデルにディメンションベースの方程式が含まれる場合に必要です。すべてのモデル方程式が変数にのみ基づく場合、ソリューション変数は必要ないため、この引数を指定するとエラーが発生します。ソリューション変数のディメンションの詳細は、「ソリューション変数のディメンション」を参照してください。
-
NOWARN は、モデルに連立方程式のブロックが含まれる際の警告が不要であることを指定するオプション引数です。
ソリューション変数のディメンション
ディメンションベースの方程式を含むモデルでは、通常、ソリューション変数は、モデル方程式の基となるディメンションによってディメンション化されます。また、ソリューション変数がコンポジットによってディメンション化される場合、モデル方程式はコンポジットのベース・ディメンションに基づきます。モデル方程式が基とするディメンションは、明示的あるいは継承されたDIMENSION文にリストされます。
ソリューション変数の特別な状況
ソリューション変数のディメンションに関する特別な状況として、次のようなことが発生する場合があります。
-
ソリューション変数が、DIMENSIONコマンドでリストされていないディメンションを持つ可能性があります。Oracle OLAPは、それらのディメンションのステータスにある値を自動的にループ処理します。たとえば、モデルに
line
およびmonth
ディメンションをリストするDIMENSION文が含まれている場合に、line
、month
およびdivision
によってディメンション化されるソリューション変数を指定するとします。Oracle OLAPは、モデルを実行する際にdivision
ディメンションを自動的にループ処理します。ソリューション変数は、DIMENSIONコマンドでリストされない1つ以上のベース・ディメンションを含むコンポジットによってディメンション化される場合もあります。「コンポジットによってディメンション化されるソリューション変数」を参照してください -
ソリューション変数が、DIMENSIONコマンドでリストされていないディメンションを持ち、かつ、それらのディメンションがステップ・ブロックまたは連立ブロックのディメンションの場合、エラーが発生します。
-
Oracle OLAPは、ソリューション変数がそれらのディメンションによってディメンション化されているかどうかにかかわらず、DIMENSIONコマンドでリストされるすべてのディメンションのステータスにある値をループ処理します。そのため、ソリューション変数が、リストされたすべてのディメンションによってディメンション化されない場合、Oracle OLAPは不要な処理を行います。Oracle OLAPはモデルの解決を開始する前に、この状況を警告します。
-
DAY、WEEK、MONTH、QUARTERまたはYEAR型の不要なディメンションをDIMENSION文に含めると、モデル方程式で融資、減価償却および集計ファンクションを使用する場合に不適切な結果が返されます。このように不適切な結果が返されるのは、モデル・ディメンションの値を参照するモデル方程式のコンポーネントが、そのコンポーネントにモデルのすべてのディメンションが含まれているかのように動作するためです。
コンポジットによってディメンション化されるソリューション変数
ソリューション変数にディメンション・リストのコンポジットが含まれる場合、Oracle OLAPは、可能な場合、常にコンポジットのスパース性を監視します。モデルを解決する際、Oracle OLAPは、コンポジットのループ処理をそのコンポジットに存在する値に制限します。ループ処理中は、コンポジットのベース・ディメンションの現行のステータスを監視します。
ただし、モデルを適切に解決するため、Oracle OLAPはコンポジットの次のようなベース・ディメンションを通常のディメンションとして処理する必要があります。
-
DIMENSION文でリストされているベース・ディメンション
-
SETを使用して作成されるモデル方程式(たとえば、ベース・ディメンションによってディメンション化される変数にデータを代入する方程式など)に関係するベース・ディメンション
-
方程式のACROSS句で指定される別のコンポジットのベース・ディメンションでもあるベース・ディメンション。(代入文およびACROSS句の使用の詳細は、SETを参照してください。)
ソリューション変数のコンポジットのベース・ディメンションが、前述の3つのどれかに該当する場合、Oracle OLAPはそのディメンションを通常のディメンションとして処理し、現行のステータスにあるすべての値をループ処理します。
ソリューション変数のコンポジットに、前述の3つのどれにも該当しない他のベース・ディメンションが含まれる場合、Oracle OLAPはそれらのベース・ディメンションの一時コンポジットを作成します。一時コンポジットの値は、基となったコンポジットに存在していた値の組合せになります。Oracle OLAPは、モデルを解決する際に一時コンポジットをループ処理します。
OLAP DML集計オブジェクト
この項では、OLAP DMLを使用したデータの集計について説明します。内容は次のとおりです。
OLAP DML集計の概要
これまでは、データの集計といえば、小計や総計を算出するために詳細データを合計することを指しました。しかし、OLAP DML aggmapオブジェクトを使用すると、より複雑な集計計算を指定できます。
-
階層ディメンションによってディメンション化されたサマリー・データは、様々な方法(たとえば、最初、最後、平均または加重平均など)を使用して計算できます。このような集計の例は、例9-18を参照してください。
-
非階層ディメンションによってディメンション化されたサマリー・データは、モデルを使用して計算できます。モデルを使用したサマリー・データの計算は、明細項目など、階層構造を持たないディメンションの値を計算するときに有効です。また、1つ以上の他の明細項目またはワークスペース・オブジェクトから、個々の明細項目の値を計算するモデルを作成できます。このような集計の例は、例9-17を参照してください。
-
サマリー・データの計算に使用される詳細データは、サマリー・データを含む変数または1つ以上の他の変数に格納できます。サマリー・データを含む変数のディメンションは、詳細データを含む変数と同じにする必要はありません。このような集計の例は、例9-15と例9-32を参照してください。
-
データは、サマリー・データに対するユーザーの要求に応じて、データベースのメンテナンス手順として集計するか、これらの方法を組み合せることができます。詳細は、「集計の実行」を参照してください。
-
ユーザーの要求に応じて集計されたデータは、要求されるたびに計算され、今後の問合せのためにアナリティック・ワークスペースに格納またはキャッシュされます。
-
集計の仕様は、永続的または一時的にできます(「カスタム集計の作成」を参照)。
OLAP DMLを使用したデータの集計
OLAP DMLを使用してデータを集計するには、次の手順を実行します。
-
AGGREGATEコマンドを使用してデータベースのメンテナンス手順としてすべてのデータを集計するか、AGGREGATEファンクションまたは$AGGMAPプロパティを使用して実行時にすべてのデータを即時集計するか、あるいはそれらの方法を組み合せて一部の値を事前計算し、他の値を実行時に計算するかどうかを決定します。様々な方法については、「集計の実行」を参照してください。
-
DEFINE AGGMAP文を発行して、aggmapオブジェクトの型をAGGMAPとして定義します。
-
集計仕様を記述します(AGGMAPを参照)。
-
パーティション変数を集計する場合、PARTITIONCHECKを実行して、前の手順で作成された集計仕様が変数のパーティション化と互換性があることを確認します。互換性がない場合、集計仕様を再記述するか、CHGDFNを使用して変数の再パーティション化を行います。
-
データの一部またはすべてをAGGREGATEファンクションを使用して集計する場合は、次の作業を実行します。
-
aggmapオブジェクトをコンパイルします(「集計仕様のコンパイル」を参照)。
-
トリガーするプロパティ、オブジェクトまたはイベントを追加します。たとえば、AGGREGATEファンクションを式として含む計算式を追加し、さらに$NATRIGGERプロパティを変数に追加すると、データの実行時要求に応答してその計算式の実行がトリガーされます。
-
-
aggmapオブジェクトをアナリティック・ワークスペースの中で永続化する場合は、UPDATE文およびCOMMITを順に実行して、aggmapオブジェクトを保存します。
-
AGGREGATEコマンドを使用して計算するデータについては、次の作業を実行します。
-
(オプション)DBMS_CUBE_LOG.ENABLEプロシージャを使用して、集計操作をログに書き込みます。
-
AGGREGATEコマンドに続いてUPDATEおよびCOMMITを実行し、データを事前計算してアナリティック・ワークスペースに格納します。
-
集計仕様のコンパイル
実行時にAGGREGATEファンクションを使用して行われる集計では、aggmapオブジェクトのコンパイルが重要になります。コンパイル済バージョンのaggmapが保存されていない場合、aggmapはそれを使用するセッションごとに再コンパイルされます。
aggmapオブジェクトのコンパイルには、次の2つの方法があります。
-
aggmapオブジェクトがAGGREGATEファンクションによって使用される場合、aggmapオブジェクトをコンパイルする方法は、COMPILE文の発行のみです。aggmapを明示的にコンパイルすると、実際に使用してデータを生成する前にaggmap内の構文エラーも見つけることができて便利です。次の文では、
sales.agg
aggmapがコンパイルされます。COMPILE gpct.aggmap
-
AGGREGATEコマンドを使用してデータを集計する際、文にFUNCDATA句を含める。
AGGREGATEコマンドでFUNCDATA句を使用すると、aggmapはデータを集計する前にOracle OLAPによってコンパイルされます。たとえば、この文はコンパイルを実行し、集計データを事前計算します。
AGGREGATE sales USING gpct.aggmap FUNCDATA
注意:
一部のデータが即時計算される場合は、AGGREGATEコマンドを実行した後で、aggmapをコンパイルして保存する必要があります。
集計の実行
OLAP DMLでデータを集計するには、次の2つの方法があります。
-
AGGREGATEコマンドを使用し、データのメンテナンス手順としてデータを集計する。この方法でデータを集計するには、集計仕様において、PRECOMPUTE文か、RELATION文のPRECOMPUTE句を使用して、集計するデータを指定します。
-
AGGREGATEファンクションを使用するか、$AGGMAPプロパティを変数に追加し、必要に応じて実行時にデータを集計する。
レベル、個々のメンバー、メンバー属性、時間範囲、データ値または他の基準により、適切な方法を選択できます。また、これらの方法を組み合せ、一部の値を事前計算し、他の値を実行時に計算することもできます。この場合、通常はAGGREGATEコマンドおよびAGGREGATEファンクションに同じaggmapを使用します。しかし、場合によっては異なるaggmapを使用します。
全体的なパフォーマンスの向上を実現する1つの方法は、集計してアナリティック・ワークスペースに格納するデータの量と、即時計算に指定するデータの量のバランスを取ることです。集計仕様の中でPRECOMPUTE文またはPRECOMPUTE句を使用すると、Oracle OLAPの集計アドバイザという特殊機能を介して、AGGREGATEコマンドでデータのメンテナンス手順として集計する値や、手動で明示的に指定する値を自動的に決定できます。
カスタム集計の作成
あるセッションで使用された大部分の集計の定義は、別のセッションでも使用されます。ただし、予測またはwhat-if分析を行う場合、あるいは想定外の方法でデータを参照する場合、実行時にそのセッション限定の集計を作成する必要があります。セッション限定の集計の追加は、カスタム集計の作成と呼ばれます。次の方法で、集計の仕様を永続的に変更する必要のない非永続型の集計データを作成できます。
-
MAINTAIN ADD SESSION文を使用して、一時ディメンション・メンバーを定義し、それらのメンバーの定義の一部として集計仕様を含めます。集計仕様は、モデルまたはaggmapのどちらかです。この方法を使用して一時集計を作成する例は、例10-42を参照してください。
-
集計を指定するモデルを作成します。AGGMAP ADD文を使用して、実行時にモデルをaggmapに追加します。セッション後、この方法でaggmapに追加したすべてのモデルは、Oracle OLAPが自動的に削除します。詳細は、AGGMAP ADDまたはREMOVEモデルを参照してください。
OLAP DML割当てオブジェクト
OLAP DMLを使用したデータの割当ての概要
データ割当てをALLOCMAP型のaggmapオブジェクトで指定できます。割当てを実装するには、ALLOCMAP aggmapでALLOCATEコマンドを実行します。ターゲットは、1つ以上の階層ディメンションによってディメンション化された変数です。ソース・データは、ターゲット・セルを指定する値より上位レベルの階層ディメンションにあるディメンション値により指定されます。
ALLOCATEは、aggmapを使用して、割当てで使用する階層のディメンションおよび値、ディメンションに使用する処理の方法、および割当ての他の側面を指定します。
割当て処理の一部は、既存のデータに基づきます。そのデータを含むオブジェクトは、割当ての基礎オブジェクトとなります。このような処理では、ALLOCATEは基礎オブジェクトの値に基づいて、ソースからデータを配分します。
ALLOCATEは、AGGREGATEコマンドの処理の逆の処理を実行します。割当て処理の方法は、ソース・データをターゲット変数のセルへコピーすることといった単純な割当てから、他の計算式に基づいて配分された量、ターゲットとしての複数の変数、および異なるディメンションに異なる割当ての方法を指定するaggmapを使用して、計算式であるソースからデータを比例配分することといった非常に複雑な割当てにまで及びます。
Oracle OLAPの割当ての機能
Oracle OLAPの割当てシステムは非常に柔軟性があり、次のような多くの機能があります。
-
ソース・オブジェクト、基礎オブジェクトおよびターゲット・オブジェクトは、同じ変数または異なるオブジェクトにすることができます。
-
ソース・オブジェクトおよび基礎オブジェクトは、計算式にすることが可能なため、既存のデータで計算を実行し、その結果を割当てのソースまたは基礎として使用できます。
-
ディメンションに対する割当ての処理方法を指定できます。この処理は、単純なものから非常に複雑なものまであります。
-
割り当てられた値を、ターゲット・セルの既存の値に追加するかまたは置換するかを指定できます。
-
結果をターゲット・セルに割り当てる前に、割り当てられた値を加算または乗算する量を指定できます。
-
ディメンション階層の個々の値をロックして、それらのディメンション値のターゲット・セルのデータが割当てにより変更されないようにすることが可能です。ディメンション値をロックすると、割当てシステムはソース・データを正規化し、ロックされたデータを割当て前にソースから除外します。ソース・データを正規化しないように選択できます。
-
特定の処理に最小値、最大値、下限値または上限値を指定できます。
-
割り当てられたデータを2番目の変数にコピーして、複数の割当てのターゲットであるセルへの各割当てを記録できます。
-
基礎がNULL値の場合の割当ての処理方法を指定できます。
-
異なるALLOCATEコマンドで同じaggmapを使用して、異なるソース・オブジェクト、基礎オブジェクトまたはターゲット・オブジェクトで、同じディメンション階層値、処理および引数のセットを使用できます。
データ割当て時のNA値の処理
値をターゲット変数に割り当てる際に既存のデータを上書きする場合や、割当て前にNA
基礎を持つターゲット・セルに、割り当てられた値を書き込む場合があります。たとえば、製品ディメンションに製品を作成する場合、budget変数の新しい製品には基礎が存在しません。この場合でも、新しい製品を含む製品種目全体に広告費を割り当てることができます。
NA
値は、次のようにRELATION文で計算式および階層演算子を使用して処理できます。
-
計算式を使用したNAデータの処理:
NA
値の処理には、必要なターゲット・セルのみを示している基礎を構成する方法をお薦めします。計算式から基礎を取得することにより、基礎値の選択内容を絞り込むことができます。次の文では、新しい製品の値を既存製品の値の2倍と等しくなるようにする計算式を定義しています。このような計算式を、新しい製品に広告費を割り当てる基礎として使用できます。DEFINE formula_basis FORMULA DECIMAL <product> EQ IF product EQ 'NEWPRODUCT' - THEN 2 * product.budget(product 'EXISTINGPRODUCT') - ELSE product.budget
-
階層演算子を使用したNAデータの処理: 現在
NA
値を持つターゲット・セルにデータを割り当てるには、割当て仕様でRELATION文に階層演算子を使用します。階層演算子は、割当ての基礎として、既存のデータではなくディメンションの階層を使用します。階層演算子を使用する際の注意点として、詳細レベルのデータが稠密に移入される可能性があるため、アナリティック・ワークスペースが非常に大きくなり、データの集計に多くの時間が必要になる可能性があります。この例の続きでは、新しい製品に広告費を割り当てるために、階層の最後の演算子HLASTを使用して、製品ディメンション階層の新しい(おそらく最新の)製品にコストを割り当てるように指定します。