テックカリキュラム

Volcanoモデル徹底解説:SQL実行エンジンの内部構造を理解する

Volcanoモデル徹底解説:SQL実行エンジンの内部構造を理解する

SQLの実行計画(Execution Plan)は「どの順番で何をするか」を示しますが、実際にそれをどのように実行するかは別の問題です。その実行方式を定義する代表的なアーキテクチャが、Volcanoモデル(Iteratorモデル)です。

本記事では、データベース内部でクエリがどのように「1行ずつ」処理されるのか、その仕組みを解説します。


■ Volcanoモデルとは?

Volcanoモデルは、クエリ実行エンジンの設計パターンであり、イテレータ(Iterator)ベースの処理モデルです。

各オペレータ(演算子)は、以下の3つのインターフェースを持ちます:

  • open():初期化
  • next():次の1行を取得
  • close():終了処理

すべての処理はこの next() 呼び出しを通じて進行します。


■ 基本構造:Pull型(Demand-driven execution)

Volcanoモデルの本質は「親が子からデータを引き出す(Pull)」構造です。

 SELECT * FROM A WHERE age > 30; 

実行ツリー:

 Filter(age > 30) ↑ Seq Scan(A) 

処理の流れ:

  1. Filter が next() を呼ぶ
  2. Seq Scan が1行返す
  3. Filter が条件チェック
  4. 条件を満たせば上に返す

→ これを繰り返す


■ 擬似コードで理解する

Seq Scan

function next(): if table has more rows: return next row else: return NULL 

Filter

function next(): while true: row = child.next() if row == NULL: return NULL if condition(row): return row 

重要なのは、すべてが「1行単位」で処理されることです。


■ Volcanoモデルのメリット

① シンプルで拡張性が高い

すべてのオペレータが同じインターフェースを持つため、新しい演算子の追加が容易。

② ストリーミング処理に適している

全データをメモリに載せず、逐次処理できる。

③ パイプライン処理が可能

中間結果を保持せずに処理を連結できる。


■ Volcanoモデルのデメリット

① 関数呼び出しオーバーヘッド

next() が1行ごとに呼ばれるため、CPU効率が悪い。

② CPUキャッシュ効率が低い

データ局所性が悪く、現代CPUと相性が悪い。

③ ベクトル処理に不向き

SIMD最適化が困難。


■ 実行例:JOINの場合

Nested Loop Joinの例:

 Nested Loop ↑ ↑ TableA TableB 

擬似コード:

function next(): while outer has rows: outer_row = outer.next() while inner has rows: inner_row = inner.next() if join_condition: return combined row return NULL 

→ VolcanoモデルではJOINも同じインターフェースで動く


■ Volcano vs ベクトル化実行(最新DBとの違い)

項目Volcanoベクトル化実行
処理単位1行ずつバッチ(1000行など)
CPU効率低い高い(SIMD活用)
代表DBPostgreSQL, MySQLDuckDB, Snowflake

現代では、Volcanoモデルの欠点を克服するため、ベクトル化(Vectorized Execution)が主流になりつつあります。


■ ハイブリッド進化:Volcanoの改良

現代DBは完全なVolcanoではなく、以下の改良が加えられています:

  • Batch processing(まとめて処理)
  • JITコンパイル(LLVMなど)
  • Operator fusion(演算子統合)

PostgreSQLでもJITにより性能改善が進んでいます。


■ なぜ重要なのか?

Volcanoモデルを理解すると:

  • なぜ Nested Loop が遅いのか
  • なぜ Filter順序が重要なのか
  • なぜ インデックスが効くのか

が根本から理解できます。

つまり、これは単なる理論ではなく、SQLチューニングの本質に直結します。


■ まとめ

  • Volcanoモデルは「Iteratorベース」の実行エンジン
  • すべては next() によるPull型処理
  • シンプルだがCPU効率に課題あり
  • 現代DBではベクトル化・JITと融合して進化

SQLを極めるには、実行計画だけでなく、「どう実行されるか」まで理解することが重要です。