【ばるくいんさーと】

バルクインサート とは?

💡 1件ずつチマチマ入れてたら日が暮れる!まとめてドーン!
📌 このページのポイント
通常INSERT vs バルクインサート 通常INSERT(1件ずつ) INSERT 1件目 →commit INSERT 2件目 →commit INSERT 3件目 →commit ... 100万回のコミット ⏱ 数時間 バルクインサート(一括) INSERT INTO t VALUES (1,'a'),(2,'b'),(3,'c')... 100万件まとめて! 1回のコミット ⏱ 数分
バルクインサートのイメージ
ひよこ ひよこ

バルクインサートって、普通のINSERTと何が違うの?

ペンギン先生 ペンギン先生

普通のINSERTが「荷物を1個ずつ宅配」だとしたら、バルクインサートは「トラックでまとめて一括配送」みたいなものだよ。100万件のデータを入れるとき、1件ずつだと何時間もかかるけど、バルクインサートなら数分で済むこともあるんだ

ひよこ ひよこ

なんでそんなに速くなるの?

ペンギン先生 ペンギン先生

1件ごとにトランザクションのコミットやインデックスの更新が走ると、そのオーバーヘッドが積み重なるんだ。バルクインサートはそれをまとめて処理するから、オーバーヘッドが激減するんだよ

ひよこ ひよこ

具体的にはどうやるの?

ペンギン先生 ペンギン先生

いくつか方法があるよ。SQLで複数行をまとめて INSERT INTO t VALUES (1,'a'),(2,'b'),(3,'c') と書く方法、MySQLのLOAD DATA INFILEでCSVから直接読み込む方法、PostgreSQLのCOPYコマンドを使う方法などがあるんだ

ひよこ ひよこ

注意することってある?

ペンギン先生 ペンギン先生

大量データを一度に入れるとトランザクションログが肥大化するから、適度なバッチサイズに分割するのがコツだよ。あとインデックスを一時的に無効化してから挿入し、終わったら再構築すると、さらに速くなることがあるんだ

ひよこ ひよこ

プログラムからはどう使うの?

ペンギン先生 ペンギン先生

ORMライブラリにもバルクインサート機能があることが多いよ。たとえばPythonのSQLAlchemyやRuby on Railsのinsert_allメソッドなどだね。大量データを扱うときは必ずバルク操作を検討しよう

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「バルクインサート」って出てきたら「大量データを一気にまとめて入れる高速テクニック」と思えればだいたいOK!
📖 おまけ:英語の意味
「Bulk Insert」 = 一括挿入
💬 bulk(大量の、かさばる)をまとめてinsert(挿入)するという意味だよ
← 用語集にもどる