TL

HTAP アーキテクチャと行/列デュアルストア

更新の速いトランザクションと重い分析を一つのシステムで同時にこなす HTAP の仕組みが分かります。行/列デュアルストアの delta/main 構造と差分マージ、実行リソース分離の設計判断を原理から押さえられます。

応用HTAP列指向OLTPOLAPデュアルストアMVCC最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.HTAP は OLTP の行ストアと OLAP の列ストアを単一システムに同居させ、ETL なしで最新データを分析する。鍵は更新を吸う書き込み最適化の delta と、読み出し最適化の列指向 main を分離し、両者を読み取り時に重ねて一貫した像を見せる設計。
  • 2.新しい更新は小さな delta(行指向や差分バッファ)に追記し、背景でまとめて列指向 main へマージする。LSM と同じ追記思想で、列ストアが苦手な点更新を delta に逃がしつつ main の圧縮・スキャン効率を保つ。読み取りは main と delta を MVCC のスナップショットで束ねて整合させる。
  • 3.OLTP と OLAP は資源プロファイルが正反対なため、計算・メモリ・I/O を論理または物理に分離して干渉を抑える。同一ノードでスケジューラを分ける方式と、列レプリカを別ノードに置きレプリケーションログで追従させる方式があり、鮮度と隔離のトレードオフで選ぶ。

なぜ「行と列を1つに」したいのか

行指向は OLTP、列指向は OLAP という棲み分けは、物理レイアウトの非対称性から導かれる原則です。ところが現実の要求は「いま発生したトランザクションを、いますぐ分析したい」――注文が入った瞬間の在庫分析、決済直後の不正検知、といった鮮度依存の分析です。従来はトランザクション系から分析系へ ETL でデータを夜間コピーしていましたが、これでは分析が常に過去を見ます。

HTAP(Hybrid Transactional/Analytical Processing) は、この ETL の壁を取り払い、OLTP と OLAP を単一システムで両立させるアーキテクチャです。中核となるのが、行指向ストアと列指向ストアを同居させる 行/列デュアルストア(dual-store) で、更新は行側で受け、分析は列側で走らせます。本稿はその内部構造――delta/main の二層、差分マージ、実行リソースの分離――を設計判断の観点から解説します。

デュアルストアの基本構造:delta と main

列指向ストアは大量集計に強い一方、1行の挿入・更新が苦手です。1行を足すだけで全カラムの圧縮ブロックを触り、途中更新は圧縮の再構成を招くためです。そこで HTAP は、更新を列ストアへ直接当てず、書き込み最適化の小さな層に一度吸わせるという二層構造を採ります。

  • delta(差分ストア): 直近の挿入・更新・削除を受ける書き込み最適化層。行指向、あるいは未圧縮の小さな列バッファとして持ち、点更新を低コストで追記する。
  • main(基底ストア): 大半のデータを保持する読み出し最適化層。列指向で強く圧縮され、スキャン・集計に最適化されている。原則として直接は更新せず、追記とまとめ反映で更新する。
書き込み(OLTP)
   │  INSERT/UPDATE/DELETE を低コストで吸う
   ▼
┌──────────── delta ────────────┐   小さい・書き込み最適化・行指向/未圧縮
│ 直近の挿入・更新・削除(差分)  │
└───────────────┬───────────────┘
                │  背景でまとめてマージ(圧縮・列化)
                ▼
┌──────────── main ─────────────┐   大きい・読み出し最適化・列指向・高圧縮
│ 大半のデータ(基底スナップ)    │
└───────────────────────────────┘
                ▲
   読み取り(OLAP/OLTP):main + delta を重ねて一貫した像を見る

この「小さく書き込み最適な層に追記し、背景でまとめて読み出し最適な層へ畳む」という発想は LSM-Tree と同根です。LSM が memtable と SSTable で行っていることを、HTAP は delta と列指向 main で行う、と捉えると構造が掴めます。ランダムな点更新を避け、シーケンシャルなマージに均すことで、列ストアの圧縮効率とスキャン局所性を守るわけです。

delta の中の更新・削除をどう表すか

delta は挿入だけでなく更新・削除も吸う必要があります。主流は insert-delta と delete-delta(あるいは delete bitmap)を分けて持つ設計です。更新は「旧版を delete-delta で無効化し、新版を insert-delta に追記」と表現します。main は不変(immutable)に保ち、削除は main の行を物理的に消すのではなく delete bitmap の該当ビットを立てることで論理削除します。スキャン時はこのビットマップで墓石(tombstone)行を弾きます。

読み取り時の重ね合わせと一貫性

デュアルストアの肝は、読み取りが main と delta を一つの整合した像として見ることです。OLAP クエリが main だけをスキャンすると、delta に溜まった最新更新を取りこぼします。逆に無条件に両方を足すと、更新された旧版を二重に数えてしまいます。

これを解くのが MVCC のスナップショットです。各行版にコミット時刻(バージョン)を付与し、クエリは自分のスナップショット時刻で可視な版だけを選びます。読み取りの流れは概念的に次の通りです。

read(snapshot_ts):
  rows  = scan(main, visible_at = snapshot_ts)   # 列スキャン(高速・圧縮のまま)
  rows -= apply(delete_delta, visible_at = snapshot_ts)  # main から消された行を除く
  rows += scan(insert_delta, visible_at = snapshot_ts)   # delta の新規/新版を足す
  return merge(rows)   # 同一キーは最新版を採用

ここで重要なのは、main のスキャンは列指向のまま高速に走り、delta は小さいので重ね合わせのコストが低い点です。delta が肥大化すると重ね合わせと delta スキャンが重くなるため、マージ(後述)で delta を小さく保つことが性能の前提になります。OLTP の点読み取りは主キー索引で delta を優先的に引き、OLAP の全件集計は main を主体に delta を被せる、と経路を分けるのが定石です。

差分マージ(delta → main)の設計判断

delta は放置すれば肥大化し、読み取りの重ね合わせコストを押し上げます。そこで背景プロセスが定期的に delta を main へマージします。これは LSM のコンパクションに相当し、設計上いくつかの判断点があります。

判断点選択肢トレードオフ
契機サイズ閾値 / 時間間隔 / 負荷の谷を狙う頻繁=delta が小さく読みは軽いがマージ負荷増。稀=逆
単位テーブル全体の再構築 / パーティション単位 / 更新の多いブロックだけ細粒度ほど I/O 局所化、管理は複雑
方式main を作り直す(rewrite)/ 列ブロックへ追記マージrewrite は圧縮を最適化、追記は I/O を抑える
旧版の扱いMVCC 上で参照中の版は残す実行中スナップショットを壊さず GC で後追い回収

マージ中も読み書きは止められません。多くの実装は、新しい main を別領域に構築してからアトミックに切り替えるコピーオンライト方式を採り、切り替え前の古い main を参照中のスナップショットには見せ続けます。切り替え後、どのスナップショットからも参照されなくなった旧版を GC(ガベージコレクション) で回収します。これは MVCC の版回収と同じ問題で、長時間走る OLAP クエリが古い版を握り続けると回収が滞り、ストレージが膨らむ点に注意が要ります。

delta を小さく保てているかが全体性能を決める

HTAP の性能は delta のサイズ管理にほぼ集約されます。マージが追いつかず delta が膨れると、(1) 読み取りの重ね合わせコスト増、(2) delta スキャンが列スキャンに比べ非効率、(3) MVCC 版回収の遅延、が同時に悪化します。逆にマージを攻めすぎると OLTP の書き込み I/O とマージが競合します。書き込みレートに対してマージのスループットが上回るよう、契機と粒度を調律することが運用の要点です。

実行リソースの分離:干渉をどう抑えるか

OLTP と OLAP は資源プロファイルが正反対です。OLTP は短命・低レイテンシ・点アクセス中心で、応答時間のばらつき(テールレイテンシ)を嫌います。OLAP は長命・高スループット・全件スキャン中心で、CPU・メモリ帯域・I/O を大量に食います。同じノードで素朴に混走させると、重い分析クエリが OLTP のレイテンシを破壊します。HTAP の設計判断の二つ目は、この実行リソースをどう分離するかです。

方式分離の仕方鮮度隔離
単一ノード・論理分離同一プロセスで CPU/メモリ/IO を OLTP・OLAP に割当て、スケジューラを分ける最新(同一ストア)弱い(物理資源を共有)
列レプリカ・物理分離列ストアを別ノードに置き、レプリケーションログで追従わずかに遅延強い(ノードが別)
共有ストレージ・計算分離ストレージ層を共有し、OLTP/OLAP の計算ノードを分けるほぼ最新中(ストレージは共有)

論理分離は鮮度が最も高い一方、メモリ帯域や I/O のような物理資源は完全には切れず、隔離は弱くなります。物理分離は、OLTP のプライマリから レプリケーションログ を流して列指向レプリカを別ノードで更新し続ける方式です。分析クエリは列レプリカへルーティングされ、OLTP ノードに一切触れないため隔離が強い反面、ログ追従の遅延ぶん鮮度が落ちます。多くの場合この遅延はミリ秒〜秒オーダーで、夜間 ETL の「1日遅れ」とは別次元の鮮度です。

一貫性の境界を意識する

物理分離では、列レプリカが OLTP の最新コミットをどこまで反映しているかが問題になります。分析側で read-your-writes や強い一貫性が要るなら、レプリカのログ適用位置(apply LSN)がクエリのスナップショットに追いつくまで待つ read-wait を入れます。鮮度を最優先にせず「やや古くてよい」を許せば待ちを省け、隔離とスループットを取れます。鮮度・隔離・一貫性のどれを緩めるかが設計判断です。

まとめ

まとめ

HTAP は OLTP の行ストアと OLAP の列ストアを単一システムに同居させ、ETL を介さず最新データを分析する方式です。中核の 行/列デュアルストアは、点更新を吸う書き込み最適化の deltaと、圧縮・スキャンに最適化された列指向の mainに分け、読み取り時に MVCC スナップショットで両者を一貫した像へ重ね合わせます。delta は背景の差分マージで main へ畳まれ、これは LSM-Tree のコンパクションと同根で、delta を小さく保てているかが全体性能を決めます。OLTP と OLAP は資源プロファイルが正反対のため、実行リソースを論理または物理に分離して干渉を抑え、鮮度・隔離・一貫性のトレードオフで方式を選びます。これが、夜間 ETL に頼らず最新の業務データ上で分析を回す HTAP の内部の正体です。

データベース Article

HTAP アーキテクチャと行/列デュアルストアを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

HTAP

比較で見る軸

難易度: advanced / カテゴリ: データベース / タグ数: 6

導入後に効く点

新しい更新は小さな delta(行指向や差分バッファ)に追記し、背景でまとめて列指向 main へマージする。LSM と同じ追記思想で、列ストアが苦手な点更新を delta に逃がしつつ main の圧縮・スキャン効率を保つ。読み取りは main と delta を MVCC のスナップショットで束ねて整合させる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
データベース
タグ数
6

判断チェックリスト

  • 自社の用途が「HTAP / 列指向」に近いか確認する。
  • 強みである「HTAP は OLTP の行ストアと OLAP の列ストアを単一システムに同居させ、ETL なしで最新データを分析する。鍵は更新を吸う書き込み最適化の delta と、読み出し最適化の列指向 main を分離し、両者を読み取り時に重ねて一貫した像を見せる設計。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

HTAP列指向OLTPOLAPデュアルストアHTAP列指向OLTP