1

複数の行を効率的に更新するにはどうすればよいですか?

  1. 1 つのステートメント
  2. 複数のステートメント

1 つのステートメント文字列が大きくなりすぎて SQL が処理できない (10000 以上のエントリ/行) ことはありますか?

変更する変数が 1 つあり、それはstatus次のとおりです。

| id | status |

私のデータはリスト(ArrayList)に保存されています。

4

5 に答える 5

1

JDBCを使用して効率的に実行したい場合は、バッチ挿入のパフォーマンスに関するこのブログ投稿を必ず確認してください(更新にも適用されます)。

一般的rewriteBatchedStatements=trueに、接続文字列に追加する必要があります。次に例を示します。

Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/database_name?rewriteBatchedStatements=true","login", "password");

これにより、ドライバーは準備されたステートメントを取得し、より効率的な形式に書き直すことができます。

于 2012-07-19T11:33:30.600 に答える
1

MySQLで[データのロード]コマンドを使用する方が効率的である可能性があります。入力をCSV形式に構造化できる場合。REPLACEおよび/またはIGNOREキーワードを適切に使用します。これは、MySQLに対する数千の個別のステートメントよりもはるかに高速です。

于 2012-05-22T11:21:27.267 に答える
0

また、このようなバッチ更新を試すこともできますが、効率的かどうかはわかりません。

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行ごとに適用できます。

于 2012-05-22T12:21:17.940 に答える
0

ステータスが値のセットに制限されている場合は、ステータスに基づいてリストをサブセットに分割し、単一のステートメントごとに行のセットを更新します。特定のステータスに 10K 行ある場合でも、1 回の呼び出しで (in 演算子を使用して) 複数の行を更新できます。これにより、アプリケーションが更新のために必要とするラウンドトリップが減少します。

于 2012-05-22T11:34:23.370 に答える
0

準備されたステートメントを参照してください: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

準備済みステートメントをループの外に作成し、ループ内で、更新されたパラメーターを使用して準備済みステートメントを実行します。

于 2012-05-22T11:16:35.020 に答える