テーブルにツリー型構造を構築するプロセスがあります。次に、ツリーが構築されると、更新ステートメントが実行され、テーブル内の他の列 (手順のツリー作成部分で作成された) に基づいて、テーブル内の 1 つの列が更新されます。したがって、更新では他のテーブルへの結合はありません。テーブル内の行ごとにすべてを実行できます。テーブルの例(更新前)は以下のとおりです。
DrillPath TimePeriod CellValue
1 1 NULL
1,2 1 NULL
1,3 1 NULL
1 2 NULL
1,2 2 NULL
1,3 2 NULL
したがって、更新ステートメントは次のようになります。
update table set CellValue = dbo.SomeLongRunningFunction(DrillPath, TimePeriod)
関数dbo.SomeLongRunningFunction()
テーブルは、呼び出しごとに実行するのに約 5 ミリ秒かかり、何十万回も呼び出しています (テーブルに存在する行の数です)。以前は約 90 ミリ秒かかっていましたが、関数のパフォーマンスはすでに大幅に改善されています。関数は本質的にかなり複雑ですが、この例では複雑さを抽象化しています。更新後のテーブルの例。
DrillPath TimePeriod CellValue
1 1 5.1
1,2 1 3.2
1,3 1 NULL (NULL can be a valid answer)
1 2 1.0
1,2 2 2.5
1,3 2 8.1
x
この更新を 5 つ (または一般的な場合は並列更新)に「チャンク」し、それぞれが行のサブセットで動作するようにしたいと思います。ヒントはwith (rowlock)
、各「チャンク」が独自の行を更新し、「チャンク」が決して交差しないため、デッドロックが発生しないようにするために使用できます。
私の最初の頼りになるアプリケーションは SSIS で、ストアド プロシージャを 5 回並行して実行し、更新する低/高範囲を渡しました。ただし、他のプロシージャが待機している間、実際に更新しているのは常に 1 つのプロシージャのみのようです。これにより、更新に使用されているにもかかわらず、更新ステートメントがテーブル全体をロックしていると思われますwith (rowlock)
。クエリ ウィンドウでテーブルから選択し、更新されたレコードの数を確認できるため、実行されているのは 1 つだけです。また、作業を 5 つのプロセスに分割した場合に予想される速度でレコード数が増加していません。
これらの更新を並行して実行する方法について、他の方法論や提案を探しています。セキュリティで保護された環境 (xp_cmdshell なし、他にオプションがない場合は CLR 関数またはカスタム アセンブリ) で、"すぐに使える" SQL Server 2008 R2 Enterprise Edition の範囲内にとどまる必要があります。オプションとしてSSISもあります。
何かご意見は?