複数の行を効率的に更新するにはどうすればよいですか?
- 1 つのステートメント
- 複数のステートメント
1 つのステートメント文字列が大きくなりすぎて SQL が処理できない (10000 以上のエントリ/行) ことはありますか?
変更する変数が 1 つあり、それはstatus
次のとおりです。
| id | status |
私のデータはリスト(ArrayList)に保存されています。
JDBCを使用して効率的に実行したい場合は、バッチ挿入のパフォーマンスに関するこのブログ投稿を必ず確認してください(更新にも適用されます)。
一般的rewriteBatchedStatements=true
に、接続文字列に追加する必要があります。次に例を示します。
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/database_name?rewriteBatchedStatements=true","login", "password");
これにより、ドライバーは準備されたステートメントを取得し、より効率的な形式に書き直すことができます。
MySQLで[データのロード]コマンドを使用する方が効率的である可能性があります。入力をCSV形式に構造化できる場合。REPLACEおよび/またはIGNOREキーワードを適切に使用します。これは、MySQLに対する数千の個別のステートメントよりもはるかに高速です。
また、このようなバッチ更新を試すこともできますが、効率的かどうかはわかりません。
update `id_status_table` `row`
set `status` = (
select case `row`.`id` when 1 then 'one'
when 2 then 'two'
else 'three or more' end
);
10000行のクエリ文字列は大きくなりすぎる可能性がありますが、そのようなクエリを1000行ごとに適用できます。
ステータスが値のセットに制限されている場合は、ステータスに基づいてリストをサブセットに分割し、単一のステートメントごとに行のセットを更新します。特定のステータスに 10K 行ある場合でも、1 回の呼び出しで (in 演算子を使用して) 複数の行を更新できます。これにより、アプリケーションが更新のために必要とするラウンドトリップが減少します。
準備されたステートメントを参照してください: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
準備済みステートメントをループの外に作成し、ループ内で、更新されたパラメーターを使用して準備済みステートメントを実行します。