2016-07-21 11 views
1

C#アプリケーションは、Sql Serverから100万を超えるレコードを取得して処理し、データベースを元に戻します。この10万の更新ステートメントに近く、その結果、それらはすべてが次の形式を持っている -C#およびSQL Server

update Table1 set Col1 = <some number> where Id in (n1, n2, n3....upto n200) 

「ID」はint型、クラスタ化インデックスを持つ主キーです。 2つの更新ステートメントは同じIDを更新するものではないので、理論的には、それらはすべてロックなしですべて並列に実行できます。したがって、理想的には、できるだけ多くを並行して実行する必要があります。すべてが5分以内で完了することが期待されます。

今、私の質問は、それを行う最も効率的な方法は何ですか?私は以下を試しています -

  1. これを順番に1つずつ実行しています - これは最も効率的なソリューションです。 1時間かかります。
  2. スレッドごとに各アップデートを起動することでそれらを同時に実行する - 何千ものスレッドを作成しているので非常に非効率的ですが、とにかく試しましたが、1時間以上かかってしまい、問題。
  3. 新しいテーブルに一括して挿入してから、更新用の結合を実行します。しかし、複数のユーザーがそれを実行することが予想されるため、同時実行の問題に遭遇します。
  4. 更新の代わりにバッチをマージする - 私はそれを試していないので、マージは実際に個々のアップデートステートメントよりも遅いと言っています。

大量のデータを処理する多くのアプリケーションでは、これが非常に一般的な問題であることが予想されます。標準的なソリューションはありますか?任意のアイデアや提案をいただければ幸いです。

+0

これは役に立つかもしれません:http://stackoverflow.com/questions/20635796/bulk-update-in-c-sharp – TheDude

+0

数千のスレッドを作成するのではなく、スレッドプールの使用を検討しましたか? – itsme86

+1

リクエストのバッチを実行したいとします。 – TheDude

答えて

0

私はすべてのIDをspにリストとして渡すことができるように整数tbl型を作成してから、単一のクエリによってテーブル全体が更新されます。

これはまだ遅いですが、私は "idは(1,2,3)にここで" TYPEため

定義

ここ
CREATE TYPE [dbo].[integer_list_tbltype] AS TABLE(
    [n] [int] NOT NULL, 
    PRIMARY KEY CLUSTERED 
(
    [n] ASC 
)WITH (IGNORE_DUP_KEY = OFF) 
) 
GO 

があり、これは、従来よりの方法より迅速で見ます使用法。

declare @intval integer_list_tbltype 
declare @colval int=10 

update c 
set [email protected] 
from @intval i 
join Table1 c on c.ID = i.n 

ご質問があれば私に教えてください。