【べくとるかじっこう】

ベクトル化実行 とは?

公開:
💡 1行ずつ呼ばず、まとまりで渡す

データベースの処理を1行ずつではなく、複数行をまとめた単位で実行する方式。呼び出しの繰り返しを減らし、CPUを効率よく使うことを狙う。

📌 このページのポイント
ベクトル化実行 4096行を受け渡す説明用の例 1行ずつ 受け渡し4096回 1024行ずつ 4つのまとまり 受け渡し4回 各行の計算は残る 1024は例示値。実装のサイズや速度倍率を表していない
1行ずつ呼ばず、まとまりで渡す
ひよこ ひよこ
ペンギン先生 ペンギン先生
ここでは違う意味だよ。複数行の値をまとめて処理する単位を指す。1行ずつ演算子を呼ぶ代わりに、まとまりを渡して処理するのがベクトル化実行なんだ。
ひよこ ひよこ
まとめるだけで何が変わるの?
ペンギン先生 ペンギン先生
たとえば4096行を1行ずつ受け渡すなら4096回、1024行ずつなら4回の受け渡しになる。この1024は説明用で、実装の固定値ではないよ。各行を計算する仕事が消えるわけではなく、呼び出しなどの繰り返しを減らせるんだ。
ひよこ ひよこ
実際には何行くらいまとめるの?
ペンギン先生 ペンギン先生
実装によるよ。DuckDBの文書は既定のベクトルサイズを2048行としている。すべてを一度に巨大な表として渡すのでも、必ず同じ件数が埋まるのでもなく、末尾などでは少ない件数を扱うこともあるんだ。
ひよこ ひよこ
SIMDや並列処理と同じなのかな?
ペンギン先生 ペンギン先生
区別しよう。SIMDは1つの命令で複数の値に同じ演算をするCPU側の仕組み。ベクトル化実行はDBの実行方式で、SIMDを使いやすくすることはあるけれど同義ではないし、複数コアで走る保証でもないよ。
ひよこ ひよこ
まとめるほど速くなるの?
ペンギン先生 ペンギン先生
大きすぎるまとまりはメモリやキャッシュの負担にもなるよ。列の幅、演算の内容、絞り込み率などで向き不向きが変わる。特定の実験の倍率をすべてのSQLへ当てはめず、実際の負荷で確かめることが大切だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ベクトル化実行」は「1行ずつ呼ばず、まとまりで渡す」と押さえておこう!
📖 おまけ:英語の意味
「vectorized execution」 = ベクトル単位の実行
💬 vectorized executionは「ベクトル単位の実行」という意味の表現だよ。

参考資料

← 用語集にもどる