2017-03-28 6 views
0

私は約500K +のレコードを持つDataTableを持っており、DataTableに含まれるレコードごとにデータベースのフィールドを更新したいと考えています。現時点で多くの行を更新する

、私のようなので、データテーブルのID列内のすべてのレコードのリストを取得し、それらのIDにSQL in文でUPDATE文を作成しています:

string sql = "UPDATE my_table SET my_field = @timestamp WHERE id IN (" + String.Join(", ", myDataTable.AsEnumerable().Select(r => r.Field<Int64>("id")).ToList().ToArray()) + ")"; 

これは動作しますただし、IDの量が多いため、MySQLのパケットサイズがこのクエリでは十分ではないというエラーが表示されています。

パケットサイズを増やすこと以外に何ができますか?これは悪いアプローチのようです。

+0

)最高のあなたに合うかわかりませんか..?クエリを使用して同じ結果を得ることは可能ですか? – scaisEdge

+0

私はこの方法でクエリを構築しないことから始めます。このC#をタグ付けしたので、ADO.NETにアクセスできると仮定します。つまり、クエリをパラメータ化できます。 –

+0

私は2番目のTieson T.コメント。そのテーブルのすべてのレコードを更新しますか?別のテーブルで更新するIDのリストはありますか?その場合は、結合を使用して更新するレコードを選択します。 –

答えて

0

MySQLでのパケットサイズを大きくすることができる場合、私は知らないが、id_list_tableを想定すると、IDが

+0

これを行うにはきれいな方法がありますか?明示的に反復回数を固定する以外の方法はありますか? – Horace

+0

mmmmm他の方法はありませんが、クエリーが通過するIDの最大数を確認し、IDをその数に基づいてグループに分けてください。 –

0

の複数のグループに対して複数のUPDATEクエリにごUPDATEクエリを分割することにより、あなたの問題の簡単な解決策がありますMY_TABLEに更新するIDのリストが含まれています。同様のタスクについては

UPDATE my_table 
SET my_field = @timestamp 
JOIN id_list_table 
ON my_table.id = id_list_table.my_table_id 
+0

それはデータベーステーブルではなくデータテーブルですが、 – Horace

+0

でも、私はAbdullah Dibasのようなアプローチを提案します。少数のレコードIDと複数の更新ステートメントを使用します。リスト全体を処理するまでループごとにX個のIDをループするだけです。 –

0

私はかつて次のようなアプローチを使用:

  1. には、列と追加のテーブルを作成します。,record_id bigint
  2. 更新操作を開始する前に、この操作の一意の識別子(session_id)を生成してください。
  3. 生成するセッションIDと共に、このテーブルに更新する必要があるすべてのIDを挿入します。
  4. UPDATEプライマリテーブルこのテーブルにINNER JOINを使用して、特定のセッションIDを指定します。
  5. DELETEセッションIDのセッションテーブルのすべてのレコード。

それが行わだとき、あなたはパフォーマンスに作業を開始することがあります。それはすべての重要なデータが含まれていないので、オフセッションテーブルのロギング回し

  • 実験は静的なものを使う代わりにそれを必要とするたびに行います(理論的には、DROP TABLEがもっと速く動作しなければならないので、DELETE FROM)、私の場合はテーブル作成が遅すぎますので、表);
  • GUID-sの代わりにbigintを使用すると、セッションをより速く比較する必要があるためセッションを識別できます。
  • INSERT INTO -sの代わりにCOPY FROM(PostgreSQL)またはBULK INSERT(MS SQL)ステートメントを使用します。私はMySQLのために何か類似のものを見つけなかった。

私はあなたのIN句の結果、その後入手方法

関連する問題