日本オラクル
テクノロジーコンサルティング本部 DWHアーキテクト
曽根原 ふじお


1995年にOLAPプロジェクトに関わってから一貫してBI&DWH関連のスペシャリストとして 研修や実際のプロジェクトのPMなどを経験。
新しいテクノロジーを覚えるのは好きだが、 最近の新製品リリースは早すぎて、ついていくのが・・・。

 はじめに

■OTNを利用している皆さんは、Oracleデータベースはよく使われていることと思います。しかしOracle OLAPに触れたことがある方はどれだけいるでしょうか? Oracle OLAPは、以前Oracle OLAP Server(英語名:Oracle Express Server)という名の別サーバーとして販売されていた多次元データベース・サーバーの機能をOracleデータベースに取り込んだものです。オプションではありますが、Oracleデータベースをインストールすれば、それだけで多次元データベース・サーバーとして機能します。(DB作成時にOLAPオプションの選択が必要です。)。そのようなM-OLAPもR-OLAPも包含する製品がでることなど、4、~5年前までは夢物語のように思われたものです。

現在、開発者ライセンス等でOracleデータベースを使っているのであれば、OLAPも一緒に使ってみませんか?
この連載では今回から3回に渡り、Oracle OLAPを実際に触りながら、多次元データベースでできることをお伝えしていきたいと思います。後半ではサイジングやチューニングなどのトピックを取り上げて、より実践的なノウハウをご紹介します。

 

 環境の準備

■まずは、環境の準備が必要です。最低限必要なものは以下の3つです。

 

・Oracle10g Database 10g 
◇ここでは10.2.0.2 (PSR適用)を用います。
・Oracle Analytic Workspace Manager
◇リリース10.2.0.2.0Aが最新です。パッチ#5183720として入手可能。
http://www.oracle.com/technology/products/bi/olap/index.html
・GLOBALデモスキーマ
US OTNより入手可能です。デモデータはいくつかありますが、以下の10R2用のデモスキーマのComplete版をインストールすることをお勧めします。
http://www.oracle.com/technology/products/bi/olap/Readme_Global_Sample_Schema.html
http://download.oracle.com/otn/java/olap/Global_Schema_10202.zip

 

上記の製品はできるかぎり最新のものを使うことをお勧めします。古いバージョンでは、一部の画面や動作、機能が異なりますのであらかじめご了承ください。
※詳細は http://www.oracle.com/technology/products/bi/olap/collateral/olap_certification.htmlをご覧ください。

詳細な手順はそれぞれのインストールガイドを参照していただくとして、ポイントだけいくつか説明しておきます。Oracle Analytic Workspace Manager(以下、Oracle AWM)は他のオラクル製品とは異なり、インストーラによるインストール作業は不要です。 圧縮されたファイルを解凍するだけなので、任意のディレクトリに配置してください。デモスキーマにはいくつかインストールのタイプがありますが、install_complete_global.sqlを実行すれば、表領域、DBユーザー、サンプルデータ、さらにはアナリティック・ワークスペース(以下、AW)までインストールされます。

 

 Oracle AWMを使ってみよう!

■Oracle AWMの基本操作は以下のOTNサイトに掲載されていますが、簡単におさらいしてみましょう。

http://www.oracle.com/technology/obe/obe10gdb/bidw/awm/awm.htm

Oracle AWMを起動すると何もオブジェクトがない画面が表示されますので、「データベース」を選択して右クリックのメニューで「データベースをツリーに追加」を選択します。

ここで接続対象のデータベースの名前と、接続情報を入力します。データベース・オブジェクトを作成したらツリーを開くか、右クリックメニューで「データベース~に接続…」を選択すると、 以下のダイアログが表示されます。ここにデータベースのユーザー名とパスワードを指定します。今回はデモスキーマを作成したGLOBALユーザーで接続しますので、それらを入力します。

すると、スキーマの下にAWが表示されます。前述のComplete状態のデモスキーマをインストールした場合は、すでにAWの下にディメンションなどの各オブジェクトができていると思います。

いくつかオブジェクトを見てみましょう。ディメンションの下にあるTIMEを選択して、右クリックのメニューから「データTIMEを表示…」を選択します。すると、下図のような画面が表示されます。

これでTIMEディメンションの階層構造が分かります。残念ながら、複数の階層を持つディメンションはデフォルトの階層だけしか見ることができません。
今回のデータでは、CUSTOMERディメンションが複数の階層を持っています。そのような場合はデフォルト階層を切り替えてみてください。

次にメジャーを見てみましょう。データウェアハウスの世界ではファクト、メジャー、キューブなどいろいろな言葉が様々な意味で使われていますが、Oracle OLAPでは、メジャーは数値型のデータ1つ1つを指します。例えば売上金額や売上数量などです。そのほかに「キューブ」という言葉も使われます。キューブは同じディメンション構成を持つメジャーをまとめたものです。例えば、先ほどの売上金額と売上数量は同じ単位(データの細かさ、。粒度とも呼びます)で発生するため、まとめて管理したほうがよさそうです。そのような場合に1つのキューブに含めて扱います。

用意したサンプルデータにはUNIT_CUBEというキューブがあり、その中にUNITS、SALES、COSTSという3つのメジャーがあります。このうちUNITSを選択して右クリックメニューから「データUNITSを表示…」を選択してみてください。表示された画面は通称「データ・ビューア」で、多次元キューブとしてデータベースに格納された値を表示することができます。さらに「All Years」と「All Customers」の左の三角をクリックしてみてください。これがドリルダウンという操作に相当します。

上記のような画面が表示されたでしょうか。お使いのマシンにもよりますが、データを表示する速度が速いと感じませんでしたか。
同じデータを、SQL文で明細データからGROUP BYを使って表示しようとすると、もう少し時間がかかると思ったのではないでしょうか?

それこそが、Oracle OLAPの第1の利点である「事前集計により検索が早い」です。現在ではMaterialized Viewなどで事前集計してパフォーマンスを速くすることができますが、OLAPは以前から事前集計をして上位のレベルのデータを保持するため、高速な検索パフォーマンスを実現していました。それこそが思考の展開を妨げないために必須のテクノロジーだったのです。ただしこの点については、利点である反面、欠点である「バッチ処理に時間がかかる」、「ディスク容量を消費する」という問題と表裏一体でもあります。

 

Oracle OLAPのすごい点:「事前集計により検索が早い」

 

インデックスに戻る

 

 ディメンションのマッピングと作成

■次に実際のオブジェクトを作ってみましょう。ディメンションを選択した状態で、右クリックメニューから「ディメンションの作成…」を選択します。
すると、ディメンションを作成するウィザードが表示されます。そこで以下のとおり設定してみてください。

 

「一般」タブ  
  ◇名前 「PRODUCT_VBH」する。
  ◇ショート・ラベル 「商品」など好きな名前を付ける。
  ◇ロング・ラベル 「商品」 など好きな名前を付ける。
  ◇説明 「商品」 など好きな名前を付ける。
  ◇ディメンション・タイプ 「ユーザー・ディメンション」のままでOK。
「翻訳」タブ  
  ◇特に設定する個所はなし。  
「実際の詳細」  
  ◇「ディメンション・メンバーのロード」に「データ・ソースの自然キーを使用」を選択。  

 

 

 
  

 

次に階層を作成します。すでに用意されているディメンションはレベル・ベース階層のみを持っていますが、ここでは値ベース階層を作成します。値ベース階層とは英語でValue-Based Hierarchy(略してVBH)と呼ばれ、項目が階層上のどのレベルになるかは一定ではなく、どの項目の子供(下位レベル)であるかだけが定義された形式です。具体的には以下のような表で表されます。

 

製品ID 親製品ID 製品名
  製品合計
ハードウェア
ソフトウェア

 

この形式の利点には、
・1つの表にすべてのレベルの項目を格納できる
・レベルの深さを簡単に変更できる
ことなどがあります。

それでは「階層」を選択して、右クリック・メニューから「階層を作成」を選択しましょう。そこで次のように設定してください。

 

「一般」タブ  
  ◇名前 「VBH」 とする。
  ◇ショート・ラベル 「値ベース階層」とする。
  ◇ロング・ラベル 「値ベース階層」とする。
  ◇説明 「値ベース階層」とする。
  ◇「値ベース階層」を チェックする。

 

次に、実際のテーブルをディメンションにマッピングします。対象となる表はGLOBALスキーマが持っているPRODUCT_CHILD_PARENTです。手順は非常に直感的です。作成したディメンションの下に「マッピング」というツリー項目があります。それを選択するとグラフィカル・マッピング画面が表示されます。そこでGLOBALスキーマの下の「表」の下に該当のテーブルがあるので、選択した状態で右クリックメニューから「ビューをキャンバスに追加」を選びます。 表が右側のキャンバスに表示されたら、下図を参考に各項目をマウスでドラッグして、マッピングしてみてください。

 

マッピング元 マッピング先
オブジェクト名:PRODUCT_CHILD_PARENT オブジェクト名:PRODUCT_VBH
PRODUCT_ID メンバー
PARENT_ID
PRODUCT_DSC LONG_DESCRIPTION
PRODUCT_DSC SHORT_DESCRIPTION

 

これでディメンションを作成する準備は整いました。実際にデータを取り込んでディメンション・オブジェクトを作成してみましょう。該当するディメンションを選択して、右クリック・メニューから「ディメンションPRODUCT_VBHをメンテナンス…」を選択します。 ここで言うメンテナンスとは、データをロードして更新する仕組みのことを指しています。
メンテナンス・ウィザードが表示されたら、ここでは特別な操作はせず、3番目の画面で「このセッションでメンテナンス・タスクを即時実行」を選択して「終了」を押します。これにより、マッピングされた表からディメンションにデータをロードするスクリプトが実行されます。

 

 
  

 

すべての処理が完了すると結果ログの画面が表示されますので、エラーが発生していないか内容を確認してください。
成功すると、ディメンションの中身は以下のように表示されるはずです。

ここで確認していただいたのは、1つのテーブルしかない自己参照型のマスターから容易にディメンションを作成できるという点です。
もちろん、正規化された「スノーフレーク型」のマスター、非正規化された「スター型」のマスターにも対応しています。

 

Oracle OLAPのすごい点:「様々なタイプのディメンションを作成できる」

 

インデックスに戻る

 

 値ベース階層ディメンションを使ったキューブの作成

■続いてキューブも作成してみましょう。短時間で作成するため、新しいディメンションを含む以下のディメンションで構成されるキューブを作成します。

 

時間ディメンション TIME
顧客ディメンション CUSTOMER
商品ディメンション(値ベース階層) PRODUCT_VBH

 

キューブを作成する手順は次のとおりです。まずツリーから「キューブ」を選択し、右クリック・メニューで「キューブを作成…」を選択します。
ウィザードが表示されますので、それぞれの画面で以下のとおり入力していってください。

 

「一般」タブ  
  ◇名前 「UNITS_NEW」 とする。
  ◇ショート・ラベル 「Units New」 など任意の名前にする。
  ◇ロング・ラベル 「Units New」 など任意の名前にする。
  ◇説明 「Units New」 など任意の名前にする。
  ◇「キューブの集計にデフォルトの集計プランを使用」を チェックする。  
  ◇選択済ディメンション TIME、CUSTOMER、PRODUCT_VBHを選択する。
「実装の詳細」タブ  
  ◇ディメンションの順序および
スパーシティのチェックを外す。
TIMEが一番上で、TIMEだけスパーシティ
  ◇グローバル・コンポジットの使用 チェックする。
  ◇圧縮を使用 チェックする。
  ◇キューブのデータ型 DECIMAL
  ◇パーティション・キューブ チェックしない。
「ルール」タブ  
  ◇以下の図にあるように、各レベルごとにチェックをする/しないよう設定を行う。  

 

 

   
    
   

 

キューブにメジャーを追加します。「メジャー」フォルダを選択した状態で、「メジャーの作成」を選択します。

 

「一般」タブ  
  ◇名前 「UNITS」 とする。
  ◇ショート・ラベル 「Units」など任意の名前を付ける。
  ◇ロング・ラベル 「Units」など任意の名前を付ける。
  ◇説明 「Units」など任意の名前を付ける。
  ◇ディメンション・タイプ 「ユーザー・ディメンション」のままでOK。
そのほかは特に設定しません。そうするとキューブで設定した内容が引き継がれます。    

 

以上の設定が終わったら、キューブにデータを取り込みます。作成したキューブを選択して右クリックのメニューから「キューブUNITS_NEWをメンテナンス」を選択します。

 

ウィザード2枚目画面  
  ◇キューブ処理オプション 「キューブ全体を集計」を選択する。
ウィザード3枚目画面 「商品」など好きな名前を付けるてください。
  ◇「このセッションでメンテナンス・タスクを即時実行」をチェックする。  

 

 

 
  

 

ウィザードの「終了」ボタンを押すと、データ取り込みがはじまります。エラーなく終了したら、データ・ビューアーで中身のデータを表示してみてください。下図のようにデータが格納されていれば、処理は成功です。ちなみにPRODUCT_VBHディメンションを縦軸に持ってくるには、ディメンション横のぼつぼつがついたグレーの部分(ハンドラと呼びます)をマウスでドラッグします。これがスライス&ダイスという言葉に含まれているダイシングという操作にあたります。なお、スライシングとはページをめくる操作を指します。ここではCUSTOMERディメンションの項目を選択する操作になります。

このように、ディメンションとメジャーの組み合わせを簡単に変えられるところがOracle OLAPのすごい点です。
これはAW内でディメンションを共有していて、キューブごとに利用するディメンションを選択できるからです。

 

Oracle OLAPのすごい点:「ディメンションとキューブを自由に組み合わせられる」

 

インデックスに戻る

 

 ディメンション階層構造の変更

■次に、ディメンションの階層を変更してみましょう。実際のシステムではディメンションは組織であったり商品であったりしますが、これらが何年も同じ階層構造であることは少ないでしょう。また、基幹システム上は正規化された構造であっても、分析の観点では必ずしもそうでない場合があります。例えば、今回のデモデータで見ると、ハードウェア(Hardware)の下にすべてのH/Wカテゴリが同列に並んでいますが、経営層がPCとそれ以外の機器の売上げを区別して見たい場合があるかもしれません。
そのような場合、Oracle OLAPの値ベース階層であれば柔軟に対応できます。実際のテーブルを次のように更新してみてください。黄色のセルが変更点です。項目「PCs」は新たなレコードを挿入してください。

 

製品ID 親製品ID 製品名
Hardware
99 PCs
99 Portable PCs
99 Desktop PCs

 

変更したデータをコミットしたら、先ほどのディメンションのメンテナンス処理を再実行してください。次の図のように「Hardware」の下に「PCs」という項目ができていれば、ディメンションの階層構造の変更は終了です。いかがですか?とても簡単に、ディメンションの階層構造がメンテナンスできるのを実感していただけましたか?

 

Oracle OLAPのすごい点:「値ベース階層はメンテナンスが簡単」

 

インデックスに戻る

 

 キューブの再集計とオンザフライ集計

■それでは最後の仕上げに、いま今作り直した階層構造でキューブのデータを見てみましょう。そのまま表示すると、新しく作成した部分ではデータが表示されませんので、キューブの再集計を行います。キューブの再集計は先ほど実施したキューブのメンテナンス・ウィザードの最後の画面でスクリプトを作成しておき、それを再実行するだけで可能です。ここではスクリプトは作っていなかったので、再度メンテナンス・ウィザードを起動します。
気をつけるポイントは、「キューブ処理オプション」で「キューブ全体を集計」を選択しておくことです。処理が終わったらデータ・ビューアーでデータを表示してみてください。

上記のとおり、新たに追加した項目「PCs」にPortable PCsとDesktop PCsの合計が格納されているのが分かります。
このようにOracle OLAPは、分析に応じてデータの括りを変えて再集計することを想定して設計されています。

またキューブの定義画面で設定した「サマリー」タブの情報を見てください。チェックがついているレベルとついていないレベルがあると思います。
これは事前集計の結果を物理的に保持するかどうかを示しています。

例えば、上記のように設定されている場合、TIMEディメンションに対して、YEARS(年)とMONTH(月)のレベルではデータを保持するが、ALL_YEARS(合計)とQUARTER(四半期)のレベルではデータを保持しないことを意味します。
それらのレベルはどうしているかというと、データを参照する際に動的に計算しているのです。これがOracle OLAPのもうひとつの利点「オンザフライ集計」です。オンザフライ(on-the-fly)とは必要なときに実行する、という意味です。計算した結果はセッション内でキャッシュすることができます。これにより事前集計によるディスク容量の消費や処理時間と、データ照会時のパフォーマンスをバランスよく設定することができます。

 

Oracle OLAPのすごい点:「オンザフライ集計でディスク容量、・処理時間を節約」

 

インデックスに戻る

 

 まとめ

■第1回は、Oracle AWMを使ってOracle OLAPを実際に体験していただきました。デモスキーマで用意されたものをベースに、簡単なディメンションやキューブも作成してもらいました。
次回は多次元データベースならではの便利な点を、設計の観点からさらにご紹介していきます。

それでは次回をお楽しみに。

インデックスに戻る