9 高度な集計
キューブでは常に、必要に応じてサマリー・データが問合せに戻されます。キューブでは、たとえば日レベルでデータが格納できる一方、問合せにおける計算を必要とせずに四半期または年レベルで結果を戻すことができます。この章では、Oracle OLAPのユニークな集計サブシステムを最適化し、データのメンテナンスと問合せの両方に対して最高のパフォーマンスを提供する方法について説明します。
この章のトピックは、次のとおりです:
9.1 集計とは
集計とは、複数の値を1つの値に集約するプロセスです。たとえば、データを日単位で収集し、週単位で1つの値に集計して、その週データを月単位で1つの値に集計するといったことが可能です。集計によって、データにおけるパターンが明らかになり、これらのパターンが分析および意思決定の基礎になります。階層ディメンションを持つデータ・モデルを定義すると、集計データを計算できるフレームワークを提供できます。
「集計」は「サマリー」、「集計データ」は「サマリー・データ」とも呼ばれます。最もよく使用される集計演算子は合計ですが、その他にも平均、最初、最後、最小および最大など、多くの演算子が存在します。Oracle OLAPでは、加重法および階層法もサポートしています。次に、基本的な種類の演算子の機能を表す簡単な図をいくつか示します。すべての演算子の説明は、「集計演算子」を参照してください。
図9-1では、4つの子と1つの親値を持つ単層階層を示します。3つの子は値を持ち、4つ目の子は空です。この空のセルはNULLまたはNA
値を持ちます。合計演算子は、親値として値(2+4+6)=12を算出します。
平均演算子は、すべての実データの平均を計算し、集計値として((2+4+6)/3)=4を算出します(図9-2を参照)。
階層演算子では、セルのカウントの際にNULL値が含まれます。図9-3では、階層の平均演算子は集計値((2+4+6+NA)/4)=3を算出します。
加重演算子では、別のメジャーにある値を使用して、集計を行う前に加重値を算出します。図9-4では、図9-1において単純に合計した値12が、加重((3×2)+(2×4)+(NA×6)+(4×NA))を使用した場合どのように変更されるかを示します。
9.2 集計演算子
9.2.1 基本演算子
次に、基本的な集計演算子について説明します。
-
平均: NULL以外のデータ値を加算してから、データ値の数で合計値を除算します。
-
最初のNA以外のデータ値: 最初の実際のデータ値を戻します。
-
最後のNA以外のデータ値: 最後の実際のデータ値を戻します。
-
最大: 各親の子全体における最大のデータ値を戻します。
-
最小: 各親の子全体における最小の非NULLデータ値を戻します。
-
非加算: データの集計は行われません。
-
合計: 複数のデータ値を加算します。
9.2.2 伸縮法および加重法の演算子
これらの演算子には、同一キューブ内で加重値またはスケール値を与えるメジャーが必要です。重み付けメジャーでは、NA(NULL)は1
として計算されます。一方スケール・メジャーでは、NAは0
として計算されます。
「集計の順序によって結果が異なるケース」で説明するように、重み付け演算子では外部結合が使用されます。
次に、伸縮法および加重法の演算子を示します。
-
スケール合計: 加重オブジェクトの値を各データ値に追加してから、それらのデータ値を加算します。
-
重み付け平均: 加重因数で各データ値を乗算し、それらのデータ値を加算してから、加重因数の合計でその結果を除算します。
-
最初の重み付け: 最初の非NULLデータ値と、それに対応する加重値との乗算を行います。
-
最後の重み付け: 最後の非NULLデータ値と、それに対応する加重値との乗算を行います。
-
重み付け合計: 加重因数で各データ値を乗算してから、それらのデータ値を加算します。
9.2.3 階層演算子
次に、階層演算子について説明します。これらの演算子では、セルにデータが含まれているかどうかに関係なく、階層によって識別されるすべてのセルが計算に含まれます。
階層平均演算子および階層重み付け演算子では外部結合が使用されます。
-
階層の平均: データ値を加算してから、ディメンション階層の子の数でその合計値を除算します。NULL以外の子のみがカウントされる「平均」とは異なり、「階層の平均」では、それぞれの子に値が含まれているかどうかに関係なく、親のすべての子がカウントされます。
-
階層の最初のメンバー: 階層内の最初のデータ値(NULL値も含む)を戻します。
-
階層の最後のメンバー: 階層内の最後のデータ値(NULL値も含む)を戻します。
-
階層の重み付け平均: 非NULLの子データ値を対応する加重値で乗算してから、加重値の合計でその結果を除算します。「重み付け平均」とは異なり、「階層の重み付け平均」では、対応する子値がNULLの場合でも、分母の合計に加重値が含まれます。
-
階層内で最初に重み付けされた値: 階層内の最初のデータ値(NULL値も含む)と、それに対応する加重値との乗算を行います。
-
階層内で最後に重み付けされた値: 階層内の最後のデータ値(NULL値も含む)と、それに対応する加重値との乗算を行います。
9.3 集計の順序によって結果が異なるケース
OLAPエンジンでは、1回につき1つのディメンションについてキューブの集計が行われます。すべてのディメンションに対して同じ集計演算子が使用されるときは、その演算子の種類によって、計算される集計値が集計の順序によって異なる場合と集計の順序によらず一定になる場合とがあります。
1つのキューブに対して複数の集計メソッドを使用する場合は、集計の順序を指定する必要があります。ただ1つの例外として、同じディメンションでのみ重み付けメジャーの集計を行う場合は、「合計」と「重み付け合計」、または「平均」と「重み付け平均」を組み合せることができます。たとえば、Customerディメンションに対する重み付け平均の計算に使用する重み付けメジャーそのものを、Customerディメンションでのみ集計する場合などです。
重み付け演算子は、指定したディメンションおよびそれに先行するすべてのディメンションに対して圧縮することはできません。圧縮キューブに対しては、できるだけ早く重み付け演算子をリスト表示して、外部結合の数を最小にする必要があります。たとえばあるキューブにおいて、Customerディメンションに対しては「重み付け合計」が使用され、それ以外のすべてのディメンションに対しては「合計」が使用されるとします。この場合、Customerが最初に集計されるとパフォーマンスが最も高くなります。
次のトピックでは、集計演算子の順序について説明します。
9.3.1 キューブのすべてのディメンションに対する同一演算子の使用
9.3.1.1 順序によらず集計結果が一定のもの
キューブのすべてのディメンションに対して次の演算子を使用した場合は、順序によって結果が異なることはありません。
-
最大
-
最小
-
合計
-
階層の最初のメンバー
-
階層の最後のメンバー
-
階層の平均
9.3.1.2 順序によって集計結果が異なるもの
キューブのすべてのディメンションに対して次の演算子を使用した場合も、順序によって結果が異なることがあります。
-
平均
-
最初のNA以外のデータ値
-
最後のNA以外のデータ値
-
最初の重み付け
-
最後の重み付け
-
階層内で最初に重み付けされた値
-
階層内で最後に重み付けされた値
-
スケール合計
9.3.2 例: 異なる集計演算子の併用
合計演算子および最大演算子をそれぞれ単独で使用する場合はディメンションを順序付ける必要はありませんが、それらを併用する場合は順序を指定する必要があります。次の図で、集計の順序によって計算結果がどのように変わるかを説明します。図9-5に、2つのディメンションを持つ1つのキューブを示します。まずキューブの一方のディメンションに対して「合計」が計算され、次にもう一方のディメンションに対して「最大」が計算されます。
図9-6も同じキューブを示したものですが、ここでは、最初にキューブの一方のディメンションに対して「最大」が計算され、次にもう一方のディメンションに対して「合計」が計算されます。図9-5では合計の最大値が15であるのに対して、図9-6では最大値の合計が19になっています。
9.4 例: Unitsキューブの集計
この例では、GLOBAL
アナリティック・ワークスペースのUnitsキューブに対するデフォルト集計の変更について説明します。これらの変更は、次のデータ・リフレッシュ時に反映されます。
9.4.1 集計演算子および階層の選択
Analytic Workspace Managerでは、最初にすべてのディメンションに対して合計演算子を使用するよう設定した上で、すべてのディメンションのすべてのレベルを集計します。これらのデフォルト設定を変更する場合は、「集計」タブの「ルール」サブタブを使用します。
図9-7に、Unitsキューブに対する演算子を示します。Timeは、現在「最後のNA以外のデータ値」に設定されており、他のディメンションの後に集計されます。「最初」や「最後」などの演算子の場合、ディメンションの集計順序により、結果が異なる場合があります。
また、データ・メンテナンス時にCustomerディメンションのShipments階層のみ集計が行われるよう変更されています。Market階層が問合せの対象となることはほとんどないため、メンテナンスに要する時間や記憶域を節約するために、グローバルDBAはこれらの集計値を計算しないように選択します。ただし、Marketの集計を要求する問合せに対しては応答時間が長くなります。
9.4.2 事前計算値の割合の選択
Analytic Workspace Managerでは最初に、最下位パーティションに対しては35%の事前計算値、最上位パーティションに対しては0%の事前計算値を使用するコストベース集計が選択されます。パーティション化されていないキューブも35%に設定されます。この設定の場合、集計値の35%についてはデータ・メンテナンス時に計算された上で格納され、残りの65%については問合せへの応答時に計算されます。こうした設定により、データ・メンテナンスが最適化されます。
最下位パーティションに対する事前計算の割合を増やすと、最下位パーティションおよび最上位パーティションの問合せが効率化されます。また、最上位パーティションに対する事前計算の割合を増やすと、パーティション化されたディメンションのほとんどの集計されたデータおよびその他の階層に対する問合せが効率化されます。
図9-8に、Unitsキューブに関する設定を示します。ここでは、グローバルDBAにより、最上位パーティションにおける割合は0%に維持され、最下位パーティションにおける割合は35%から50%へ増加させるよう選択されています。この変更により、メンテナンスに要する時間や記憶域は増加しますが、すべてのパーティションで実行時のパフォーマンスは向上します。