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)
処理の流れ:
- Filter が
next()を呼ぶ - Seq Scan が1行返す
- Filter が条件チェック
- 条件を満たせば上に返す
→ これを繰り返す
■ 擬似コードで理解する
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活用) |
| 代表DB | PostgreSQL, MySQL | DuckDB, 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を極めるには、実行計画だけでなく、「どう実行されるか」まで理解することが重要です。