データベース特論 Online Analytical Processing 講師 : 福田剛志 fukudat@fukudat.com http://www.fukudat.com/ データベース特論 1
概要 従来のデータベースシステムは, たくさんの単純で小さい問い合わせを, うまく処理するように作られていた. 新しいアプリケーションのなかには, 少数の複雑で時間のかかる問い合わせを使うものが現れた. そこで, 分析的 (analytical) 問い合わせをうまく実行できるような新しいアーキテクチャが開発された. データベース特論 2
データウェアハウス (data warehouse) データを統合するための方法 ひとつのデータベース ( ウェアハウス ) にデータをコピーし, できるだけ最新に保つ. 良くある方法 : 定期的 ( たとえば毎晩夜中に ) にウェアハウスを構築する. 分析的な問い合わせには必須となることが多い. データベース特論 3
オンライントランザクション処理 (online transaction processing or OLTP) ほとんどのデータベース操作は, オンライントランザクション処理 (OLTP) を含む. 少数のレコードが関わる, 短い, 単純で, 頻繁な問い合わせや更新処理 例 ) 銀行の振込み チケットの予約 株のオンライン取引 データベース特論 4
オンライン分析処理 (online analytical processing or OLAP) オンラインの分析的な処理が重要になってきた 少数だが何時間もかかる様な複雑な問い合わせ 必ずしも, 最新のデータが対象でなくても良い 場合によっては, データマイニングとも呼ばれる 例えば オンライン書店 (e.g., アマゾン ) は顧客の購買履歴を分析して, 顧客それぞれが興味を持つページを作るために利用している. スーパーマーケットは地域ごとに異なる顧客の趣向を調べて, 売り上げを伸ばそうとする. データベース特論 5
共通のアーキテクチャ 各支店のデータベースが OLTP 処理を行う. 支店のデータベースの内容を中央のウェアハウスに毎晩コピーする. 分析処理には中央のウェアハウスを用いる. データベース特論 6
スタースキーマ (star schema) ウェアハウスで良く用いられるスキーマ ( データの整理方法 ) 以下の 2 種類の表 (table) からなる ファクトテーブル (fact table) 大量の 事実 の集まり. 例えば, 販売情報 ( 何時, 誰が, 何を, 幾らで買った ) 追加されるだけ ( のことが多い ) 次元テーブル (dimension table) 事実に含まれている情報を修飾する, 小さな ( 通常静的な ) 情報 データベース特論 7
スタースキーマの例 ウェアハウスでお酒の販売情報 ( 店, 酒の銘柄, 酒を購入した客, 日時, 値段 ) を管理したい ファクトテーブル 販売 ( 店名, 酒名, 客名, 日時, 値段 ) 次元テーブル 店 ( 店名, 住所, 種類 ) 酒 ( 酒名, 製造元 ) 客 ( 客名, 住所, 性別 ) データベース特論 8
次元属性 (dimension attribute) と従属属性 (dependent attribute) ファクトテーブルの属性には 2 種類ある 次元属性 : 次元テーブルのキー 従属属性 : 次元属性の値によって値が決まる属性 例 : 酒の販売ウェアハウス 値段 属性は従属属性, その他の属性は次元属性 酒を購入した金額は, 店名, 酒名, 客名, 日時の組み合わせで決まる. データベース特論 9
ウェアハウスを作る 2 つの方法 ROLAP = 関係 (relational) OLAP 関係データベースを, スタースキーマがうまく扱えるようにする. MOLAP = 多次元 (multidimensional) OLAP データキューブ をモデル化することに特化したデータベースを用いる. データベース特論 10
ROLAP の技法 ビットマップインデックス (bitmap index) 次元テーブルのキー (e.g., 酒テーブルの 名前 属性 ) のとりうる値それぞれについて, ファクトテーブルのどのタプルがその値をとるかをビットベクトルで表現する. マテリアライズドビュー (materialized view) ウェアハウス内に, いろいろな問い合わせに役立ちそうな途中結果を計算し, ビューとしてとっておく. データベース特論 11
典型的な OLAP の問い合わせ (1/2) OLAP の問い合わせは普通, スタージョイン (star join) で始まる ファクトテーブルと次元テーブルのナチュラルジョイン (natural join) 例えば SELECT * FROM 販売, 店, 酒, 客 WHERE 販売. 店名 = 店. 店名 AND 販売. 酒名 = 酒. 酒名 AND 販売. 客名 = 客. 客名 データベース特論 12
典型的な OLAP の問い合わせ (2/2) スタージョインで始まり 注目しているタプルを次元データを用いて選択し いくつかの次元でグルーピングして ある属性について集計する 例えば, 早稲田界隈でキリンの製造するお酒の売上げを, 店舗ごと, 銘柄ごとに集計したい SELECT 店名, 酒名, SUM( 値段 ) FROM 販売 NATURAL JOIN 酒 NATURAL JOIN 店 WHERE 住所 = 早稲田 AND 製造元 = キリン GROUP BY 店名, 酒名 データベース特論 13
マテリアライズドビュー (materialized view) 毎回, ファクトテーブルと次元テーブルを使ってはじめから計算し直すと, 時間がかかりすぎてしまう. もし十分な情報を持つビューを事前に計算しておけば, ずっと速く計算できるかもしれない. では, どんなビューがあれば例題の問い合わせに役立つだろうか? 少なくとも 販売 酒 客 テーブルを含むジョイン 少なくとも 店名 酒名 を含む属性リストでのグルーピング 早稲田にある店やキリンが製造した酒を捨てない 住所 製造元 店名 酒名 属性を捨てない データベース特論 14
役に立つビューの例 : マテリアライズドビューの例 CREATE VIEW 販店酒 ( 店名, 住所, 酒名, 製造元, 売上 ) AS SELECT 店名, 住所, 酒名, 製造元, SUM( 値段 ) AS 売上 FROM 販売 NATURAL JOIN 店 NATURAL JOIN 酒 GROUP BY 店名, 住所, 酒名, 製造元 関数依存性 ( 店名 住所, 酒名 製造元 ) があるので, これらは本当のグルーピングではない. このビューを使って例題に答えると : SELECT 店名, 酒名, SUM( 売上 ) FROM 販店酒 WHERE 住所 = 早稲田 AND 製造元 = キリン GROUP BY 店名, 酒名 データベース特論 15
MOLAP とデータキューブ (data cube) 次元テーブルのキーはハイパーキューブ (hypercube) の次元 例えば, 販売テーブルは 4 次元 ( 店名, 酒名, 客名, 日時 ) 依存属性 (e.g., 値段 ) はキューブの格子点に現れる. 店 1, 酒 3, 客 2 店 2, 酒 3, 客 2 店 3, 酒 3, 客 2 客 次元 店 1, 酒 2, 客 2 店 2, 酒 2, 客 2 店 3, 酒 2, 客 2 店 3, 3, 酒 3, 3客 1 店 2, 2, 酒 3, 3客 1 店 2, 酒 1, 客 2 店 1, 1, 酒 3, 3客 1 店 1, 酒 1, 客 2 店 3, 酒 1, 客 2 酒 次元 店 1, 1, 酒 2, 2客 1 店 2, 2, 酒 2, 2客 1 店 1, 1, 店酒 11, 1客 1 店 3, 3, 酒 2, 2客 1 店 2, 2 店酒, 21, 1客 1 店 次元 日時 次元店 3, 3 店酒, 31, 1客 1 データベース特論 16
周辺 (marginals) データキューブは集計 (aggregation) を周辺に持つ 1 次元の周辺,2 次元の周辺... 例えば, 1 次元 : 店ごとの売上高, 酒ごとの売上高, 客ごとの売上高 2 次元 : ( 店と酒 ) のペアごとの売上高,...... データベース特論 17
データキューブの構造 特別な値 * を各次元に導入する * に相当する格子点は, その属性の集計値をとるものとする 例えば, 売上 ( 魚民, 八海山, *, *) は店 魚民 における. 酒 八海山 の, すべての客とすべての日時にわたる売上の合計を表す. データベース特論 18
ドリルダウン (drill-down) とロールアップ (roll-up) ドリルダウン = 逆集計 集計された結果を, ある次元に対して分解して細かく見ていく操作 例えば, 魚民 の売上高が与えられたとき, お酒の銘柄ごとの売上高に分けて詳細化する ロールアップ = 集計 ある次元に沿って集計する操作 例えば, 八海山 の各店舗の客ごとの売上高を集計して, 八海山 の店ごとの売上高を求める データベース特論 19
データキューブのマテリアライズドビュー データキューブに対する問い合わせには, 次元に沿って集計したマテリアライズドビューが役に立つ. 完全に集計してしまわずに, 次元テーブルの値によってグルーピングして集計してもよい. 例えば, 客については完全に集計してしまう 酒についてはまったく集計しない 日時については, 週単位にグルーピングして集計する 店については, 街ごとにグルーピングして集計する データベース特論 20