In Silico

データ基盤

OLTPとOLAPを、なぜ別々のデータベースで動かすのか

2026/10/3 シリーズ「データ基盤はなぜ作り直されてきたか」 第1回 / 全2回

  • OLTP
  • データベース
  • データ基盤
  • OLAP
  • HTAP
  • TPC-C
  • TPC-H
  • PostgreSQL
  • MySQL
  • F1 Lightning
  • TiDB
  • HyPer
  • キャッシュ
  • MVCC
  • リードレプリカ
  • スナップショット
  • スループット
  • 集計
  • トランザクション
  • データウェアハウス
  • SAP HANA
  • Redshift
  • 列指向
  • 応答時間
目次
背景・問い・要点
背景

通販サイトや銀行の業務システムは、注文の登録や支払いのような処理を一日に大量にこなす。こうした処理は、顧客が画面の前で待っているので、一件ずつ短い時間で終わる必要がある。業務システムのデータベースには、会社の売上や在庫の最新の状態がすべて入っている。

そのため、売上の推移を見たい担当者は、業務システムのデータベースに直接集計の問い合わせを投げたくなる。データは最新で、別の場所へ写す手間もかからない。ところが、多くの組織は分析のためのデータベースを業務用とは別に用意し、業務用のデータを定期的に写している。写せばデータは古くなり、写す仕組みを作って保守する手間もかかる。それでも分けるのは、業務用のデータベースで集計を動かすと、顧客を待たせる処理が遅くなるからである。

データ基盤を学ぶ読者がまず知るべきことは、この「分ける」判断の理由と代償である。理由を知らないと、分析用の基盤がなぜ業務用とは別の形に発展してきたのかが読めない。本稿は、二つの仕事を定義した性能測定の仕様、データベースの開発者が書いた文書、両方を一つのシステムで扱う設計の測定を公開した論文を例に取る。

問い

業務の処理と分析は、なぜ同じデータベースで動かさず、別々のデータベースに分けるのか。

要点

業務の処理(OLTP)と分析(OLAP)は一回に触るデータの量が桁で違い、同じ資源で動かすと分析が OLTP の資源を奪うので、分析は別のコピーで動かすのが基本であり、HTAP でも干渉を小さく抑えた設計はコピーを分けている。 HTAP は、両方を一つのシステムで扱う設計を指す。業務の処理は一件ごとに多くは数十行を読み書きし、分析はときに数百万行を読んで結合と集計をする。共有する CPU やキャッシュを長い分析が占めると、短い処理が待たされる。分けた代償として、分析は業務用より遅れたデータを読む。

モデル・例示

一回の集計が、注文の処理が使うキャッシュを押し流す

※ この節の数値は説明のための仮定で、測定値ではありません。

ある通販サイトの注文データベースを考える。データベースはデータを「ページ」という固定長の単位でディスクに保存し、よく使うページをメモリ上のキャッシュに置く。キャッシュには 1,000 ページが入る。注文の登録は、一件ごとに顧客・商品・在庫などの 10 ページを読み書きする。注文の登録がよく使うページは 500 ページあり、すべてキャッシュに載っている。そのため、注文の登録はディスクを読まずに終わる。

ここで、月次の売上集計のために、注文の表全体の 100,000 ページを一度ずつ読む。キャッシュは、空きが無いときに最も長く使われていないページを捨てて、新しく読んだページを入れるとする。集計の間は注文の登録が来ないとする。集計が 1,000 ページを読み終えた時点で、キャッシュはすべて集計が読んだページで埋まり、注文の登録が使う 500 ページは捨てられている。集計が終わったとき、キャッシュには注文の表の最後の 1,000 ページだけが残る。

ディスクから 1 ページを読むのに 5 ミリ秒かかり、キャッシュから読む時間は無視できるとする。集計の直後の注文の登録は、10 ページすべてをディスクから読み直すので、一件に 50 ミリ秒かかる。集計の前は、ほぼ 0 ミリ秒だった。

以上の数から、三つのことが言える。

  1. 集計が読むページの数(100,000)は、注文の登録一件が触るページの数(10)の 1 万倍である。二つの仕事は、一回に触るデータの量が 4 桁違う。
  2. キャッシュが最も長く使われていないページから捨てる方式なら、キャッシュの容量より多いページを一度に読むと、そのキャッシュを共有する処理が使っていたページは、すべて捨てられうる。
  3. 集計を別のコピーで動かせば、注文の登録が使うキャッシュは減らない。ただし、コピーを一日一回作るなら、集計が読むのは最大で一日前の状態である。

業務の処理と分析は、一回に触るデータの量が桁で違う

データベースの分野では、業務の処理を OLTP(オンライントランザクション処理)、分析を OLAP(オンライン分析処理)と呼ぶ。トランザクションは、注文の登録のように、まとめて成功するか、まとめて取り消すかのどちらかになる一連の読み書きを指す。

Chaudhuri と Dayal の 1997 年の解説論文は、二つの仕事の違いを次のように書く1。OLTP のトランザクションは、数十行のレコードを、多くの場合は主キーで探して読み書きする。主キーは、表の各行を一つに特定する列である。OLTP で重視する性能は、単位時間に終えたトランザクションの数(スループット)である。これに対して、OLAP の問い合わせは数百万行のレコードを読み、表全体の走査・結合・集計を多く行う。OLAP で重視する性能は、問い合わせの応答時間と、単位時間にこなす問い合わせの数である。

データベースの性能を比べる業界団体の TPC は、二つの仕事を別々のベンチマークとして定義している。OLTP のベンチマークである TPC-C では、注文の登録(New-Order)一件が平均 10 品目の注文明細を扱い、各種類のトランザクションの 90% 以上が 5 秒未満(在庫確認だけは 20 秒未満)で終わることを求める2。分析のベンチマークである TPC-H は、対象を「大量のデータを調べる」意思決定支援のシステムと定め、その問い合わせは「ほとんどの OLTP トランザクションよりはるかに複雑」だと書く3。

Stonebraker と Çetintemel は 2005 年の論文で、二つの仕事に向くデータの持ち方も違うと述べた4。業務用のデータベースは一行の全項目をまとめて書けるように行単位で保存する。分析用のデータベースは、少数の列を大量の行について集計する問い合わせに向けて、読みやすい形で保存する。二人は同じ論文で、分析の仕事には列単位で保存する形(列指向)が大きな性能の利点を持つと述べている。

同じデータベースで集計を動かすと、業務の処理が影響を受ける経路が三つある

Stonebraker と Çetintemel によれば、大企業のシステム管理者は、分析をする利用者を業務用のシステムに入れることをためらってきた4。複雑な分析の問い合わせが、業務の画面を使う利用者の応答時間を悪化させると考えたからである。分析が業務の処理に影響する経路を、データベースの開発者と研究者の文書で確かめると、少なくとも三つある。

一つ目の経路は、CPU と実行の順番の奪い合いである。SAP と大学の研究者は 2014 年に、OLTP と OLAP を同じシステムで動かす性能測定(CH-benCHmark)で、二つのシステムを測った5。データ量は約 7 GB で、分析の利用者の数を 1 から 128 まで倍々に増やした。SAP HANA の既定の設定では、分析の利用者を増やすほど OLTP のスループットが下がり、分析の利用者が 128 になって計算資源が飽和すると、OLTP のスループットはほぼゼロになった。著者らは原因を、長く走る分析の処理が計算資源を長時間占め、次々に届く短い OLTP の処理に空きを残さないことだと説明している。この論文は、法的な理由で絶対値を公開せず、相対値だけを示している。

二つ目の経路は、キャッシュの追い出しである。PostgreSQL の開発者は、ソースコードに添えた設計の文書で、大きな表を一度だけ順に読む処理について書いている6。通常の規則でキャッシュを入れ替えると、その読み込みが「キャッシュ全体を吹き飛ばす」。PostgreSQL は、これを避けるために、順に読む処理には 256 KB の小さな専用領域だけを使わせる。MySQL の InnoDB も、表全体を読む処理が頻繁に使うページを押し出さないように、新しく読んだページをキャッシュの順番の途中に入れる7。どちらの対策も既定で入っている。キャッシュの経路は、対策の無い単純な方式で起きる危険であり、現在の主なデータベースは既定でその一部を防いでいる。

三つ目の経路は、古い版のデータの保持である。多くのデータベースは MVCC(多版型同時実行制御)という方式で、書き換えた行の古い版をしばらく残し、読み始めた時点の状態を読む処理に見せる。MySQL のマニュアルは、読むだけのトランザクションでも定期的に終わらせるよう勧めている8。長い読み込みが続くあいだは古い版を消せず、業務用のデータベースで古い版を置く領域が大きくなり続け、その領域を使い切るおそれがあるからである。この経路で文書が書いているのは、処理の遅れではなく領域の圧迫である。

実際の組織がこの危険をどう扱ったかの例として、オンライン学習サービスの Udemy の技術ブログがある9。Udemy は 2014 年 5 月に分析用のデータベース(Amazon Redshift)を立ち上げるまで、分析の処理をすべて本番の MySQL で動かしていた。ブログは、これが問題だった最大の理由を、一つの悪い問い合わせがサイトの性能を落とし、最悪の場合はサイトを止めうることだったと書く。ブログが書いているのは起こりうる危険であり、実際に起きた障害の記録ではない。

分析を別のコピーへ移すと、業務は守れるが、遅れと手間を払う

分析を業務用のデータベースから外す最も小さな手は、同じデータベースのコピー(リードレプリカ)を作り、そこで集計を動かすことである。PostgreSQL の文書は、この構成の制約を書いている10。コピー側で長い問い合わせを動かすと、元のデータベースが古い版を片付けた変更をコピーに反映するときに衝突が起き、問い合わせが取り消されることがある。古い版の片付けによる取り消しを防ぐ設定を有効にすると、今度は元のデータベースで古い版の片付けが遅れ、表が膨らむ。文書はこの状態を、元のデータベースで直接問い合わせを動かした場合より悪くはならない、と説明している。コピーで分析を動かすと CPU とキャッシュの負担はコピーに移るが、古い版の片付けを通じた影響は業務用のデータベースに残る。

分析を業務用とは別のデータベースへ完全に移すと、業務の処理の資源は守れる。その代わりに、分析が読むデータは業務用のデータより遅れる。TPC-H の仕様は、この遅れを許している。TPC-H のデータベースは、変更をまとめて取り込む更新処理によって、OLTP のデータベースの状態を「場合によっては遅れて」追いかける3。仕様は同じ節で、TPC-H のデータベースを「OLTP のアプリケーションが同時に走るデータベースではない」とも明記している。分析のベンチマークそのものが、分析用のデータベースを、業務用の状態を更新処理で追いかける別のデータベースとして定義している。

分けて持つ理由は、負荷だけではない。Chaudhuri と Dayal は、業務用のデータベースは現在の状態しか持たず、傾向をつかむのに必要な過去のデータや、複数のシステムにまたがるデータが欠けることを、もう一つの理由に挙げる1。Uber の技術ブログは、2014 年より前の状態を、データが数個の OLTP のデータベース(MySQL と PostgreSQL)に分かれ、組み合わせるには利用者が自分でコードを書くしかなく、全体を見渡せなかったと書いている11。

HTAP でも、業務への干渉を小さく抑えた設計は分析用のコピーを分けている

二つのデータベースを持つ形には、データの遅れと二重の運用という代償がある。この代償を嫌い、一つのシステムで OLTP と OLAP の両方を扱う設計を HTAP(ハイブリッドトランザクション・分析処理)と呼ぶ。SAP の共同創業者の Plattner は 2009 年の講演論文で、データウェアハウス(分析用に別に作るデータベース)の導入を妥協だったと書き、両方を一つのシステムで扱うことを望ましいと述べた12。SAP のデータベース製品である SAP HANA では、OLTP と OLAP が同じデータを対象にする5。Plattner 自身の試作システムでは、問い合わせを同時に動かすと、一件の挿入にかかる時間が大きく増えた。Plattner はこれを実装の問題と見ている。

HTAP を主張する設計のうち、測定が論文で公開されているものを比べると、OLTP への干渉の大きさは、分析をどこで実行するかで分かれる。

同じサーバーで両方を動かす二つの設計では、分析を増やすと OLTP のスループットが大きく落ちた。HyPer は、Kemper と Neumann が 2011 年に発表した、データをすべてメモリに置くデータベースである13。著者らは、複雑な分析の問い合わせを OLTP の待ち行列にそのまま入れると、後に続くすべての OLTP の処理がその完了を待つことになり、システムが詰まると書く。HyPer は、OS の機能で OLTP の状態を写したスナップショットを同じサーバーの上に作り、分析をそのスナップショットの上で動かす。前の節で挙げた 2014 年の測定では、スナップショットを作り直さない最も速い設定でも、分析の利用者が 128 になると HyPer の OLTP のスループットはほぼゼロになり、SAP HANA と同じ形を示した5。分析の利用者が 22 問ごとにスナップショットを作り直す設定では、分析の利用者を一つ加えただけで OLTP のスループットが約 30% 下がった。HyPer の 2011 年の論文自身も、8 コアのサーバー 1 台で分析の問い合わせの流れを 1 本から 8 本に増やすと、OLTP のスループットが毎秒約 12.7 万件から約 6.5 万件に下がった値を示している13。著者ら自身は、この値を、分析を動かし続けたままでも出せた OLTP の性能として評価している。

分析用のコピーを別のサーバーに置く二つの設計について、TiDB は OLTP のスループットの低下を、F1 Lightning は分析の CPU 時間を測っている。TiDB は、PingCAP が開発するデータベースである。2020 年の論文の要旨は、HTAP のデータベースは二つの種類の問い合わせを互いに干渉させないために、それぞれ専用のデータのコピーを持つ必要があると書く14。TiDB は、OLTP 用の行単位のコピーとは別に、分析用の列単位のコピーを別のサーバーに置くことができ、測定もその構成で行った。PingCAP の測定(CH-benCHmark、6 台のサーバー)では、分析の利用者を増やしても、OLTP のスループットの低下は最大 10% だった。同じ論文は、同じ 6 台のサーバーと同じデータ量の CH-benCHmark で、取引と分析の両方を扱う分散データベースの MemSQL 7.0 も測っている。HTAP のシステムで二つの仕事を隔てる問題を示すための比較で、分析の利用者を増やすと MemSQL の OLTP のスループットは 5 分の 1 以下に落ちた。論文は、TiDB の低下の小ささをこの MemSQL の結果と対比している。これらの数値は、いずれも TiDB の開発元である PingCAP 自身による測定である。

F1 Lightning は、Google が 2020 年に発表した仕組みで、業務用のデータベースの変更を取り込み、分析に向く列単位の別のコピーを作って最新に保つ15。Google は、本番の分析の問い合わせを、同じ時点のデータに対して業務用のデータベースと F1 Lightning の両方で動かし、CPU 時間を比べた。これも、Google が自社の仕組みについて行った測定である。データを読む側の CPU 時間は、業務用のデータベースで動かすと、問い合わせの規模によって F1 Lightning の 2.3 倍から 11.8 倍(中規模の問い合わせで最大)かかった。論文は、分析の問い合わせの多くは業務用のデータベースでも動かせるが、はるかに高い費用がかかると書いている。この比較は、同じ分析を業務用のデータベースで動かすと、その分の CPU を業務用の側で何倍も使うことを示す。

コピーを分けない方向も残っている。2014 年の測定の著者らは、同じシステムの中で OLTP と OLAP の処理を区別し、異なる優先度で実行する仕組みが必要だと結論した5。実際に SAP HANA で分析の並列実行を止める設定にすると、OLTP のスループットは既定の設定より上がった。ただし、この方向で干渉がどこまで小さくなるかは、同じ論文でも今後の課題とされている。

OLTP への干渉そのものを測った四つの設計の範囲では、低下が小さかったのは分析用のコピーを別のサーバーに置いた TiDB だった。コピーを分ける HTAP の設計が変えたのは、利用者から見た入口である。利用者は一つのシステムに問い合わせを投げ、システムがコピーの作成と同期を自動で行う。分析用のコピーを持つと決めると、次の問題は、複数の業務用データベースに散らばったデータを、どこへ、どの形で集めるかになる。

出典15件
  1. Chaudhuri, Dayal「An Overview of Data Warehousing and OLAP Technology」ACM SIGMOD Record 26(1), 1997. https://doi.org/10.1145/248603.248616 — OLTP と OLAP の仕事の違いと、分けて持つ二つの理由。 ↩ ↩2

  2. TPC「TPC Benchmark C Standard Specification, Revision 5.11」2010. https://www.tpc.org/TPC_Documents_Current_Versions/pdf/tpc-c_v5.11.0.pdf — 注文一件の品目数(平均10)と応答時間の上限(§2.4, §5.2)。 ↩

  3. TPC「TPC Benchmark H Standard Specification, Revision 3.0.1」. https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf — 意思決定支援の定義と、OLTP の状態を遅れて追う更新処理、OLTP のアプリケーションが同時に走るデータベースではないこと(§0.1)。 ↩ ↩2

  4. Stonebraker, Çetintemel「“One Size Fits All”: An Idea Whose Time Has Come and Gone」ICDE, 2005. https://doi.org/10.1109/ICDE.2005.1 — 管理者が分析の利用者を業務用に入れなかった理由と、保存の形の違い(§2, §5.1)。 ↩ ↩2

  5. Psaroudakis ほか「Scaling Up Mixed Workloads: A Battle of Data Freshness, Flexibility, and Scheduling」TPCTC, 2014. https://infoscience.epfl.ch/server/api/core/bitstreams/8db0953d-9e2f-4fd4-a721-2a3d92345d46/content — 分析128で OLTP がほぼゼロ(§5.2, §5.3)と優先度づけの提案。 ↩ ↩2 ↩3 ↩4

  6. PostgreSQL Global Development Group「src/backend/storage/buffer/README」. https://github.com/postgres/postgres/blob/master/src/backend/storage/buffer/README — 大きな順次読み込みがキャッシュを追い出すことと、256 KB の専用領域。 ↩

  7. Oracle「MySQL 8.0 Reference Manual, 17.8.3.3 Making the Buffer Pool Scan Resistant」. https://dev.mysql.com/doc/refman/8.0/en/innodb-performance-midpoint_insertion.html — 表全体を読む処理から頻繁に使うページを守る既定の仕組み。 ↩

  8. Oracle「MySQL 8.0 Reference Manual, 17.3 InnoDB Multi-Versioning」. https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html — 長い読み込みが古い版の削除を妨げ、undo の表領域を満たしうること。 ↩

  9. Sullins「Improving Amazon Redshift Performance: Our Data Warehouse Story」Udemy Tech Blog, 2018. https://medium.com/udemy-engineering/improving-amazon-redshift-performance-our-data-warehouse-story-5ec1282c13d8 — 2014年まで分析を本番の MySQL で動かしていたことと、その危険。 ↩

  10. PostgreSQL Global Development Group「PostgreSQL 18 Documentation, 26.4 Hot Standby」. https://www.postgresql.org/docs/current/hot-standby.html — コピー側の長い問い合わせの取り消しと、元のデータベースの表の膨張(§26.4.2)。 ↩

  11. Shiftehfar「Uber’s Big Data Platform: 100+ Petabytes with Minute Latency」Uber Engineering Blog, 2018. https://www.uber.com/en-US/blog/uber-big-data-platform/ — 2014年より前、データが複数の OLTP データベースに分かれ全体を見渡せなかったこと。 ↩

  12. Plattner「A common database approach for OLTP and OLAP using an in-memory column database」SIGMOD, 2009. https://doi.org/10.1145/1559845.1559846 — データウェアハウスを妥協と見る立場と、同時実行で挿入が遅くなった観察(§1, §4.2)。 ↩

  13. Kemper, Neumann「HyPer: A hybrid OLTP&OLAP main memory database system based on virtual memory snapshots」ICDE, 2011. https://doi.org/10.1109/ICDE.2011.5767867 — スナップショットで分析を隔てる設計と、分析 1→8 本での OLTP の値(Fig. 9)。 ↩ ↩2

  14. Huang ほか「TiDB: A Raft-based HTAP Database」PVLDB 13(12), 2020. https://www.vldb.org/pvldb/vol13/p3072-huang.pdf — 干渉を避けるための専用のコピーと、業務のスループット低下が最大10%という自社測定、同じ条件の MemSQL 7.0 で 5 分の 1 以下に落ちた比較(§6.5, §6.6)。 ↩

  15. Yang ほか「F1 Lightning: HTAP as a Service」PVLDB 13(12), 2020. https://www.vldb.org/pvldb/vol13/p3313-yang.pdf — 列単位の別のコピーと、業務用で動かすと CPU 時間が 2.3〜11.8 倍という比較(Table 2)。 ↩

この記事はAIが執筆しています。内容には誤りが含まれる可能性があります。ご注意ください。