【ばるくいんさーと】

バルクインサート とは?

最終更新:
💡 データも、まとめて運べば手間を減らせる

複数のデータをまとめてデータベースに挿入する方法。複数行のINSERTや専用の一括読み込み機能を使い、通信やSQL処理の繰り返しを減らす。速度やトランザクションの扱いは製品・設定・データ量によって変わる。

📌 このページのポイント
データをまとめて、送る回数を減らす1件ずつ名前3件SQLを3回送るINSERT 1INSERT 2INSERT 3まとめて名前3件SQLを1回送る3行のINSERT送る回数とコミット回数は別だよ
複数行のINSERTを使う例。同じ3件を登録します。速度の倍率はデータ量・制約・環境によって変わります。
ひよこ ひよこ
1件ずつ入れるのと、何が違うの?
ペンギン先生 ペンギン先生
たとえば名前3件を登録するとき、INSERTを3回送る代わりに、複数行を含むINSERTを1回送れるよ。送信やSQLの解析などを繰り返す手間を減らせるんだ。CSVのようなファイルを読む専用機能も、一括登録でよく使われるね。
ひよこ ひよこ
どのくらい速くなるの?
ペンギン先生 ペンギン先生
一律の倍率は言えないよ。データ量、通信、インデックスや制約、ストレージなどで変わる。PostgreSQLは、大量データの読み込みにはCOPYを推奨している。実際の構成で所要時間と負荷を測って、方法を選ぶのが確実だね。
ひよこ ひよこ
まとめれば、コミットも必ず1回になる?
ペンギン先生 ペンギン先生
一括登録とトランザクションは別の話だよ。1件ずつのINSERTでも、BEGINからCOMMITまでの1つのトランザクションにまとめられる。逆に、大量の一括登録を複数のトランザクションへ分割することもある。図の矢印は送るSQLの回数で、コミット回数ではないんだ。
ひよこ ひよこ
速くするために、インデックスを消してもいい?
ペンギン先生 ペンギン先生
本番の既存テーブルでは慎重に考えよう。インデックスを外すと、他の利用者の検索が遅くなったり、一意制約の検査が失われたりする。新しいテーブルへの大量読み込み後に索引を作る方法はあるけれど、速さだけを理由に制約を外すのは避けたいね。
ひよこ ひよこ
大量データを全部、一度に送るのがいい?
ペンギン先生 ペンギン先生
大きすぎると、メモリ、要求サイズ、ロックや失敗後のやり直しが問題になることがあるよ。入力を検査して、扱いやすい件数に分けよう。どこまで成功したかを記録し、再実行で重複しない設計も大切なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「バルクインサート」って出てきたら「複数のデータをまとめてデータベースに入れる方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Bulk Insert」 = 一括挿入
💬 bulkは大量・ひとまとまり、insertは挿入という意味だよ。

参考資料

← 用語集にもどる