2017-10-03 6 views
0

私は次のように見ているテーブルました:この表並列運転ストアドプロシージャと同じテーブルの列を更新する

Key Customer Attr1 Attr2 Attr3 Attr4 Attr5 ...  Attr70 
123 Smith  NULL NULL NULL NULL NULL ...  NULL 
456 Wesson NULL NULL NULL NULL NULL ...  NULL 
.... 

は(約3)万行のいくつかを持っています。
各属性には、この列を埋める計算ロジックを持つ独自のストアドプロシージャがあります。

現在、これらのストアドプロシージャはシリアルで実行されており、かなりの時間がかかります。彼らは次のように実行されます:EXEC dbo.fill_Attr1 @Customer = 'Smith'

私はこれらのストアドプロシージャを(ジョブスケジューリングツールによって開始された)並列実行していましたが、残念ながら毎時DEADLOCKSが起きました。

これらのSPをすべて並列に実行するにはどうすればよいですか?
私はWITH (NOLOCK)を追加しようと考えていました。これは私が読んだことは良い習慣ではありません。
しかし、これはバッチプロセスで起こっているので、他のプロセスはそれらのSPが動作している間にデータを変更または挿入することはできません。

質問をより明確にするための追加情報。
現在、これらのSPが実行されているシリアルは次のように:

EXEC dbo.fill_Attr1 @Customer = 'Smith' 
EXEC dbo.fill_Attr1 @Customer = 'Wesson' 
EXEC dbo.fill_Attr2 @Customer = 'Smith' 
EXEC dbo.fill_Attr2 @Customer = 'Wesson' 
EXEC dbo.fill_Attr3 @Customer = 'Smith' 
EXEC dbo.fill_Attr3 @Customer = 'Wesson' 

各ストアドプロシージャは、常に1人の顧客のすべてレコードを更新します。
属性を計算する方法に応じて、これは単一の更新で行うことができます。または、より複雑なロジックの場合は、ストアドプロシージャ内の複数の更新で行うことができます。

それを解決するにはどのような良いアイデアですか?事前に

おかげ
ステファン

+0

私はそれがどのように動作するのかを知りません:EXEC dbo.fill_Attr1 @Customer = Smithはattr1を世話してくれます。それだけです。したがって、テーブルを更新するには70 * 300,000または210,000,000コールがかかりますか? –

+0

プロシージャが1つしか使用されず、すべての列に対して1回で更新が適用されるようにロジックを変更できますか? –

+0

@LeeEverest:いいえ、各属性にはストアドプロシージャが1つあります。合計で70個のSPがあります –

答えて

0

私は列全体、1つのユーザー/人/顧客スミスのではないだけを更新するために、PROCを書き換えると思います。

+0

これはコメントであり解決策ではありません。上記のコメントに記載されているように、ストアドプロシージャはすでに顧客のすべてのレコードを更新しています。単一のレコードだけではありません。 –

+0

私はあなたが私に従っているかどうかわからない - 顧客のすべての記録を言う。私は列内のすべての顧客のすべての記録を言っている。同じページにある? –

+0

属性を見積もるために必要な属性は、ある顧客のために用意されていますが、別の顧客の準備ができていない可能性があります。顧客Aの準備が整い、70 SPのチェーンが既に開始されている可能性があります。おそらく数分後に顧客Bのデータが準備され、70 SPのチェーンが開始されます。顧客が同時に実行している場合、デッドロックが発生します。 –

関連する問題