15 人が閲覧(直近 30 日) データベース

OLAP(オーラップ)とは?多次元分析の仕組みとMOLAP・ROLAP・HOLAPの選び方をSQL実行例つきで解説

OLAP(オーラップ)とは?多次元分析の仕組みとMOLAP・ROLAP・HOLAPの選び方をSQL実行例つきで解説

OLAPは、売上や在庫を「地域別」「商品別」「月別」と軸を切り替えながら集計し、その場で答えを返すためのデータ処理方式です。言葉としては1993年のレポートで登場し、30年以上たった今も製品名や機能名として残っています。ただし中身は大きく入れ替わりました。専用のキューブを事前に構築する方式はクラウドの主要サービスから外れつつあり、実務では、列指向データベースにSQLを直接投げる構成が有力な選択肢になっています。この記事では、OLAPの定義と読み方、キューブ操作の実体、MOLAP・ROLAP・HOLAPの違いを一次情報の記述で確認し、実際に動かしたSQLの出力まで示します。

まとめ:OLAPの要点

  • OLAPはOnline Analytical Processingの略で、日本語では「オーラップ」と読み、「オンライン分析処理」と訳します(同じ読みの医薬品名とは無関係です)。
  • キューブ型OLAPの速さは事前集計によるものです。ディメンション(分析軸)の組み合わせごとに合計を計算済みにしておき、問い合わせにはその読み出しで答えます。ただし事前集計は速さの唯一の手段ではありません。
  • スライス、ダイス、ドリルダウン、ロールアップ、ピボットという操作は、SQLではGROUP BYの対象列の入れ替えとして表現できます。専用ツールが無くても実行できます。
  • MOLAP・ROLAP・HOLAPはMicrosoft SQL Server Analysis Servicesのパーティション格納モードで、Azure Analysis ServicesとFabric/Power BI Premiumは非対応です。
  • いまOLAP的な処理を担うのは、事前集計キューブを持たない列指向のMPPエンジン(ClickHouse、Apache Druid、Apache Pinot、StarRocksなど)です。
  • 分析軸が毎回変わる探索的な分析では、キューブを作る手間が回収できません。まずキューブを作らないところから始めるべきです。

OLAPの定義と「オーラップ」という読み方

OLAPはOnline Analytical Processingの頭字語で、多次元の集計クエリに対話的な速度で答えることを目的とした処理方式を指します。日本語では「オーラップ」と読み、「オンライン分析処理」と訳されます。「オラップ」と表記されることもあります。

用語の出所は、E. F. Codd、S. B. Codd、C. T. Salley の3名によるレポート「Providing OLAP to User-Analysts: An IT Mandate」です。本文末尾に「Copyright © 1993 by E. F. Codd & Associates. All rights reserved.」と記されています。ここで示された「OLAPの12ルール」がこの言葉の起点になりました。

ただし、この12ルールをベンダー中立な製品評価軸として受け取るのは誤りです。レポート自身が冒頭で「Finally, a commercially available product is evaluated according to the rules for OLAP.」(最後に、市販の製品1つをOLAPのルールに従って評価する)と宣言し、本文でも「Of the several products in the marketplace, the one that appears to be the most robust and, at the same time, able to withstand the tests against these prescribed criteria is Hyperion Essbase」(市場にある複数の製品のうち、最も堅牢でこれらの規定基準に耐えうるのはHyperion Essbaseである)と特定製品を名指ししています。24ページ中の1章がその製品の評価に割かれた文書です。

12ルールはISOやANSIが定めた規格ではなく、この1993年のレポートで提示された要件リストにすぎません。製品選定のチェックリストとしてそのまま使うのは避けてください。実務で役に立つのは、後述する格納方式と分析操作の理解のほうです。

多次元データモデルとキューブ操作

OLAPキューブを構成するディメンション・メジャー・階層

OLAPが扱うデータは、集計対象の数値であるメジャー(売上金額、数量、原価など)と、それを切り分ける軸であるディメンション(地域、商品カテゴリ、期間、顧客セグメントなど)の組で表現します。ディメンションは階層を持ちます。期間なら年から四半期、月、日へ。地域なら全国から地方、都道府県、店舗へ。この階層があるおかげで、集計の粒度を上下に動かす操作が定義できます。

この構造を「キューブ」と呼びます。軸が3本のときの直感的な呼び名がそのまま定着したもので、軸が4本以上でもキューブと呼びます。物理的に立方体のデータ構造を持つかどうかは実装次第です。

OLAPキューブの基本操作とSQLでの対応

キューブに対する操作は5種類に整理できます。

操作 やること SQLでの対応
スライス 1つの軸を1つの値で固定して断面を見る WHERE句で1軸を絞る
ダイス 複数の軸をそれぞれ複数値で絞る WHERE句で複数軸を範囲指定
ドリルダウン 集計粒度を細かくする(年から月へ) GROUP BYに下位階層の列を追加
ロールアップ 集計粒度を粗くする(月から年へ) GROUP BYから下位階層の列を除く
ピボット 行と列に置く軸を入れ替える 表示側の並べ替え(集計結果は同じ)

操作名は独特ですが、書き換えているのはクエリの一部です。スライスとダイスは主にWHERE、粒度の変更は主にGROUP BYで表現できます。ピボットだけは集計結果の見せ方の問題で、処理系のPIVOT構文や条件付き集約、表示側の行列変換を使います。BIツールの画面上でドラッグしている裏側では、この書き換えが起きています。

キューブ型OLAPの速さを支える事前集計と、その代償

キューブ型のOLAPが「速い」と言われる理由は、クエリを受けてから計算しないからです。ディメンションの組み合わせごとの合計をあらかじめ計算して保持しておき、問い合わせにはその読み出しで答えます。この計算済みデータをアグリゲーションと呼びます。なお、事前集計は速さを得る唯一の手段ではありません。後述する列指向エンジンは、列単位の圧縮とベクトル化実行によって、事前集計のキューブを持たずに同種の集計を処理します。

裏返すと、事前集計にはコストが2つあります。1つは処理時間で、元データが更新されるたびに集計をやり直す必要があります。もう1つは鮮度で、次の処理が走るまでの間、キューブの中身は元データと一致しません。Microsoftの公式ドキュメントもこの点を明記しており、MOLAPについて「The data in the partition’s MOLAP structure is only as current as the most recent processing of the partition.」(パーティションのMOLAP構造内のデータは、直近の処理時点の鮮度しか持たない)と述べています。リアルタイム性が要件に入るなら、この前提から設計をやり直す必要があります。

SQLで書くOLAP集計|ROLLUP・CUBE・GROUPING SETSの実行結果

OLAP的な集計は専用製品の専売特許ではありません。SQL規格にはOLAPのための追補「ISO/IEC 9075-2:1999/Amd 1:2001 Amendment 1: On-Line Analytical Processing (SQL/OLAP)」(2001年3月発行)があり、分析用の機能が規格として整備されています。GROUPING SETS、ROLLUP、CUBEはPostgreSQL、DuckDB、SQL Server、Oracleなど主要な処理系が実装しており、小計と総計を1本のクエリで同時に出せます。

以下は、DuckDB 1.4.5のPython APIで実際に実行した出力そのものです。まず検証用のテーブルを作り、ROLLUPで地域別の小計と全体総計を出します。

CREATE TABLE sales(region VARCHAR, category VARCHAR, quarter VARCHAR, amount INTEGER);
INSERT INTO sales VALUES
 ('東日本','家電','2026Q1',1200),('東日本','家電','2026Q2',1500),
 ('東日本','食品','2026Q1', 800),('東日本','食品','2026Q2', 900),
 ('西日本','家電','2026Q1', 700),('西日本','家電','2026Q2', 650),
 ('西日本','食品','2026Q1', 500),('西日本','食品','2026Q2', 620);

SELECT region, category, sum(amount) AS amount
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

┌─────────┬──────────┬────────┐
│ region  │ category │ amount │
│ varchar │ varchar  │ int128 │
├─────────┼──────────┼────────┤
│ 東日本  │ 家電     │   2700 │
│ 東日本  │ 食品     │   1700 │
│ 東日本  │ NULL     │   4400 │
│ 西日本  │ 家電     │   1350 │
│ 西日本  │ 食品     │   1120 │
│ 西日本  │ NULL     │   2470 │
│ NULL    │ NULL     │   6870 │
└─────────┴──────────┴────────┘

categoryがNULLの行が地域小計、両方NULLの行が総計です。PostgreSQLの公式ドキュメントはROLLUPを「represents the given list of expressions and all prefixes of the list including the empty list」(与えられた式のリストと、空リストを含むそのすべての先頭部分列を表す)と定義しています。階層をそのまま上にたどる集計に対応します。

CUBEは先頭部分列ではなく、べき集合(すべての組み合わせ)を作ります。同じ公式ドキュメントの表現では「represents the given list and all of its possible subsets (i.e., the power set)」です。列がN個なら2のN乗個のグループ化集合が生成されるため、軸を増やすと出力が急激に膨らみます。

SELECT region, category, sum(amount) AS amount
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

┌─────────┬──────────┬────────┐
│ region  │ category │ amount │
│ varchar │ varchar  │ int128 │
├─────────┼──────────┼────────┤
│ 東日本  │ 家電     │   2700 │
│ 東日本  │ 食品     │   1700 │
│ 東日本  │ NULL     │   4400 │
│ 西日本  │ 家電     │   1350 │
│ 西日本  │ 食品     │   1120 │
│ 西日本  │ NULL     │   2470 │
│ NULL    │ 家電     │   4050 │
│ NULL    │ 食品     │   2820 │
│ NULL    │ NULL     │   6870 │
└─────────┴──────────┴────────┘

ROLLUPの7行に対してCUBEは9行です。増えた2行が、地域を無視したカテゴリ別の合計にあたります。必要な組み合わせだけが欲しいときはGROUPING SETSで明示します。空の括弧が総計を指します。

SELECT region, quarter, sum(amount) AS amount
FROM sales
GROUP BY GROUPING SETS ((region),(quarter),())
ORDER BY region NULLS LAST, quarter NULLS LAST;

┌─────────┬─────────┬────────┐
│ region  │ quarter │ amount │
│ varchar │ varchar │ int128 │
├─────────┼─────────┼────────┤
│ 東日本  │ NULL    │   4400 │
│ 西日本  │ NULL    │   2470 │
│ NULL    │ 2026Q1  │   3200 │
│ NULL    │ 2026Q2  │   3670 │
│ NULL    │ NULL    │   6870 │
└─────────┴─────────┴────────┘

構成比のように「小計に対する割合」を出したい場合は、ウィンドウ関数を重ねます。sum(sum(amount)) OVER (PARTITION BY region)のように集約関数の外側にOVER句を置くと、地域ごとの合計を各行に展開できます。ここまでが標準SQLの範囲であり、OLAP専用ツールを導入しなくても多次元集計の大半は書けます。DuckDBとは?特徴・用途とSQLite・PostgreSQLとの違いを解説で触れているように、単一ファイルの分析用エンジンでも同じ構文が動きます。

MOLAP・ROLAP・HOLAPの違いと選び分け

OLAPの実装方式として並べられるMOLAP・ROLAP・HOLAPは、Microsoft SQL Server Analysis Services(SSAS)多次元モデルのパーティション格納モードとして明文の定義があります。公式ドキュメントの定義を要約すると次のようになります。

モード 集計値の格納先 元データの複製 クエリ応答 向く用途
MOLAP 多次元構造(SSAS側) あり 最速 明細まで含めた高速応答
ROLAP RDB側のインデックス付きビュー なし 最も遅い 大容量かつ低頻度、リアルタイム参照
HOLAP 多次元構造(SSAS側) なし 集計値は最速、明細は遅い サマリ中心の参照

公式の記述は次のとおりです。MOLAPは「causes the aggregations of the partition and a copy of its source data to be stored in a multidimensional structure」、ROLAPは「causes the aggregations of the partition to be stored in indexed views in the relational database」「does not cause a copy of the source data to be stored」、HOLAPは「Like MOLAP, HOLAP causes the aggregations of the partition to be stored in a multidimensional structure」「HOLAP does not cause a copy of the source data to be stored」。集計値をどこに置くか、元データを複製するかの2軸で3方式が分かれている、と読むのが正確です。

この3方式を解説する日本語記事は多いのですが、前提条件まで書いているものはほとんど見当たりません。同じMicrosoft Learnのページ冒頭には対象製品のバナーがあり、SQL Server Analysis Servicesのみが対象で、Azure Analysis ServicesとFabric/Power BI Premiumは対象外と示されています。Azure Analysis Servicesの概要ページも「Multidimensional models and PowerPivot for SharePoint are not supported in Azure Analysis Services.」(多次元モデルとPowerPivot for SharePointはAzure Analysis Servicesでサポートされない)と明記しています。

つまり、クラウドのAnalysis Servicesを使う限り、MOLAP・ROLAP・HOLAPを選ぶ場面自体が発生しません。選択肢は表形式(tabular)モデルのインメモリかDirectQueryかになります。「実装方式を3つから選ぶ」という説明を読んで移行計画を立てると、前提から外れます。

OLTPとの違いは「1件を確実に」か「全件を速く」か

OLAPの対になる概念がOLTP(Online Transaction Processing)です。違いは処理の単位に集約されます。

観点 OLTP OLAP
典型的な処理範囲 少数行の参照・更新 多数行の走査・集約
読み書きの比率 更新が多い ほぼ読み取り専用
データ配置 行指向・正規化 列指向・非正規化
評価指標 1件あたりの応答時間とスループット 集計クエリの完了時間

この線引きは性能評価の世界にも現れています。標準化団体TPCの現行仕様一覧(2026年9月8日更新)では、OLTP側のベンチマークがTPC-C 5.11.0、意思決定支援側がTPC-H 3.0.1とTPC-DS 4.0.0と分かれています。TPCの説明でもTPC-Cは「an OLTP workload」と定義され、意思決定支援の事実上の業界標準とされるTPC-DSにはiterative OLAPを含むクエリが並びます。同じデータベース製品を測るのに別々のベンチマークが用意されている。この事実が両者の要求性能の違いを端的に示します。

同じデータベースでOLTPの更新と大規模な分析クエリを同時に走らせると、CPU・メモリ・ディスクI/Oの取り合いが起きます。PostgreSQLのようにMVCCを採る処理系では読み取りが更新を待たされるわけではありませんが、資源の競合は残ります。業務システムのデータをDWHへ複製する構成が定番になっているのはこのためです。両者の使い分けやHTAP(両者を1つのエンジンで担う方式)、クラウドでのデータベース選定についてはOLTPとは|OLAP・DWHとの違いとHTAP・AWS DB選定を比較解説で扱っています。データを貯める側の設計はデータウェアハウス(DWH)とは?仕組み・製品比較・選び方をわかりやすく解説を参照してください。

2026年のOLAP製品|キューブ専用機から列指向エンジンへ

OLAPという言葉は残っていますが、担う製品は入れ替わりました。2026年9月9日時点で、各プロジェクトの公式リリース情報に載っている最新版は次のとおりです。

製品 最新リリース 公開日 方式
Apache Kylin 5.0.4 2026-07-13 事前集計キューブ
Apache Druid 37.0.0 2026-05-08 列指向・時系列取り込み
Apache Pinot 1.5.1 2026-06-05 列指向・低遅延
StarRocks 4.1.3 2026-07-14 列指向MPP
ClickHouse 26.8.2.7 2026-09-01 列指向(stable/LTS)

キューブを事前構築するApache Kylinは現在も開発が続いており、公式リリースノートには5.0.4が2026年7月13日として掲載されています。一方で、新規に基盤を組むときは事前集計キューブを前提としない列指向エンジンも有力な選択肢になりました。列指向のストレージと圧縮、ベクトル化実行によって、キューブを作らなくても集計クエリが十分速く返るようになったためです。製品ごとの設計判断はApache Druidとは?リアルタイムOLAPの仕組み・取り込み設計から採用判断まで実装者向けに解説、Apache Pinotとは?超低遅延OLAPの仕組み・star-tree索引とupsert設計から採用判断まで解説、StarRocksとは?MPP列指向の仕組みとテーブル設計・ClickHouse比較で採用判断を解説【2026年版】、ClickHouseとは?列指向DBの仕組み・MergeTreeの実装からBigQueryとの使い分けまで実装者向けに解説で個別に整理しています。

Microsoftの系譜でも同じ流れが起きています。1998年に登場したSQL Server 7.0 OLAP ServicesがMicrosoft製品にOLAP機能を導入しましたが、そのクラウド版であるAzure Analysis Servicesは多次元モデルを引き継がず、表形式モデルだけを提供しています。キューブという実装は、製品カタログの中心からは外れました。

OLAPが効く業務と、キューブを作るべきでない場面

OLAPの発想が効くのは、見る軸があらかじめ決まっていて、同じ形の集計を繰り返す業務です。具体的には次のような場面が該当します。

  • 月次の売上実績を、地域・商品カテゴリ・チャネルの決まった組み合わせで締める経営レポート
  • 在庫回転率や欠品率を、店舗別と商品別で毎日同じ形で見る小売の需給管理
  • 製造ラインごとの不良率を、工程・部材ロット・時間帯の軸で追う品質管理
  • 広告費と売上を、媒体・キャンペーン・期間の軸で突き合わせる予実管理

共通しているのは、軸の一覧が事前に確定していて、同じ集計を何百回も繰り返す点です。この条件を満たすからこそ、事前集計のコストが回収できます。

逆に、次の条件に当てはまるならキューブは作らないほうがよいと考えます。

  • 分析軸が毎回変わる:探索的な分析では、キューブに含めていない軸が必ず要求されます。そのたびにキューブ定義の変更と再処理が必要になり、分析のリードタイムがキューブの処理時間に固定されます。
  • データが数千万行規模にとどまる:この規模なら、まず列指向データベースへ素で投げて応答時間を実測してください。実測はクエリ、データ型、配置、ハードウェア、同時実行数をそろえて行います。それで業務が回るなら、キューブの設計・処理・監視という運用を丸ごと持ち込む理由はありません。
  • 数分以内の鮮度が要件:MOLAPの鮮度は直近の処理時点までです。ニアリアルタイムが要件なら、方式選定の段階から外すべきです。判断基準はリアルタイム分析とは?バッチとの違いと導入を見送る判断基準を解説で整理しています。
  • 明細1件の参照が主目的:注文番号での引き当てのような単一行アクセスは、OLTP側のデータベースで処理すべき仕事です。

初期方針としては「まずキューブを作らない」を推奨します。列指向データベースへSQLを直接投げる構成から始め、特定のクエリが遅くて業務が回らないと実測できた時点で、その集計だけをマテリアライズドビューや事前集計テーブルに落とす。この順序なら、キューブの運用コストを負うのは本当に必要な範囲だけで済みます。

よくある質問

OLAPの読み方は?

「オーラップ」と読みます。「オラップ」と表記されることもあります。Online Analytical Processingの頭字語で、日本語では「オンライン分析処理」と訳されます。

OLAPとOLTPの違いは何ですか?

1回の処理が触るデータ量と、読み書きの比率が違います。OLTPは少数行の参照・更新を高頻度に処理し、OLAPは比較的広い範囲を走査・集約する傾向があります。同じデータベースに同居させると互いの性能を落とすため、通常はOLTPのデータをDWHへ複製してOLAP側で分析します。

MOLAP・ROLAP・HOLAPはどれを選べばよいですか?

SQL Server Analysis Servicesの多次元モデルを使う場合に限り選択肢になります。明細まで高速に返したいならMOLAP、元データの鮮度を優先し容量を抑えたいならROLAP、サマリ参照が中心ならHOLAPです。ただしAzure Analysis ServicesとFabric/Power BI Premiumは多次元モデル自体をサポートしないため、クラウドではこの選択は発生しません。

OLAPとデータウェアハウス(DWH)はどう違いますか?

DWHは分析用データを貯める場所、OLAPはそのデータを多次元に集計する処理方式です。層が違うので対立関係にはありません。DWHの上にOLAPの仕組みを載せる構成が一般的です。

OLAP専用ツールがなくてもOLAP分析はできますか?

できます。ROLLUP、CUBE、GROUPING SETSとウィンドウ関数はSQLの標準構文で、PostgreSQLやDuckDBを含む主要な処理系が実装しています。この記事の各コードブロックのうちSQL文の部分は、DuckDB 1.4.5でそのまま実行できます(枠線の表は、その実行結果です)。専用ツールの価値は集計そのものより、画面上での軸の切り替えと権限管理にあります。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.23 テックブログ Renta!はいつ再開?不正アクセスでメールアドレス等が流出したおそれ・再開時のパスワード再設定と運営側の対応
  2. 2026.07.09 テックブログ Muse Imageとは?Metaの画像生成AIの使い方・API料金(1枚0.01ドル)と日本での提供状況【2026年10月】
  3. 2026.10.23 テックブログ Splunk 脆弱性CVE-2026-76299:影響版の確認と10.2.8などへの更新手順
  4. 2026.10.22 テックブログ Tomcatのバージョン一覧とサポート期限【2026年10月】最新版11.0.27、9.0系は2027年3月末終了・9.1系は2030年末まで
  5. 2026.10.21 テックブログ ユミルリンク不正アクセス第二報で延べ5,162万件:Cuenote FC利用企業と受信者の確認点

RELATED POSTS 関連記事

目次