大規模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文が生成され、移行スクリプトで順次実行できます。

試してみる — JSON to Bulk INSERT

フルツールを開く