大規模JSONデータセット(1000行以上)のインサート
数千件のレコードを含む大規模JSON配列を、データベース互換性のためにバッチサイズ指定で複数のINSERT文に分割して処理します。
Basic INSERT
詳細な説明
大規模データセットの処理
JSON配列に数百から数千のレコードが含まれる場合、単一のINSERT文はデータベースの制限を超える可能性があります。Bulk INSERTツールは、設定可能なバッチサイズでデータを複数のINSERT文に分割することでこの問題を解決します。
問題点
ほとんどのデータベースには文のサイズに実用的な制限があります:
| データベース | 一般的な制限 |
|---|---|
| MySQL | max_allowed_packet(デフォルト4MB) |
| PostgreSQL | 約1GBだが実用的には約65,535パラメータ |
| SQLite | SQLITE_MAX_VARIABLE_NUMBER(デフォルト999) |
| SQL Server | INSERT1文あたり1,000行 |
解決策:バッチサイズ
バッチサイズを100または500行に設定すると、ツールが複数のINSERT文を生成します:
-- バッチ 1 / 10
INSERT INTO events ("id", "action", "timestamp")
VALUES
(1, 'login', '2024-01-01 09:00:00'),
(2, 'click', '2024-01-01 09:01:00'),
-- ... さらに98行
(100, 'logout', '2024-01-01 10:40:00');
-- バッチ 2 / 10
INSERT INTO events ("id", "action", "timestamp")
VALUES
(101, 'login', '2024-01-01 11:00:00'),
-- ... 以下同様
適切なバッチサイズの選択
- 10-50行: どのデータベースでも安全、デバッグに便利
- 100-500行: 本番インポートの良いデフォルト
- 1000行: SQL Serverの上限、PostgreSQLには好適
- それ以上: チューニング済みのPostgreSQLにのみ推奨
パフォーマンスのヒント
バッチをトランザクション(BEGIN; ... COMMIT;)でラップすると、文ごとのトランザクションオーバーヘッドを回避できます。ツールにはこの目的のための「トランザクションでラップ」トグルがあります。
ユースケース
JSONエクスポートから50,000件のイベントログレコードをMySQLに移行する場合。バッチサイズを500に設定すると、MySQLのパケット制限内に収まる100個のINSERT文が生成され、移行スクリプトで順次実行できます。