私は次のように見ているテーブルました:この表並列運転ストアドプロシージャと同じテーブルの列を更新する
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人の顧客のすべてレコードを更新します。
属性を計算する方法に応じて、これは単一の更新で行うことができます。または、より複雑なロジックの場合は、ストアドプロシージャ内の複数の更新で行うことができます。
それを解決するにはどのような良いアイデアですか?事前に
おかげ
ステファン
私はそれがどのように動作するのかを知りません:EXEC dbo.fill_Attr1 @Customer = Smithはattr1を世話してくれます。それだけです。したがって、テーブルを更新するには70 * 300,000または210,000,000コールがかかりますか? –
プロシージャが1つしか使用されず、すべての列に対して1回で更新が適用されるようにロジックを変更できますか? –
@LeeEverest:いいえ、各属性にはストアドプロシージャが1つあります。合計で70個のSPがあります –