2

テーブルにツリー型構造を構築するプロセスがあります。次に、ツリーが構築されると、更新ステートメントが実行され、テーブル内の他の列 (手順のツリー作成部分で作成された) に基づいて、テーブル内の 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もあります。

何かご意見は?

4

1 に答える 1

0

そこで、更新を実行する手順でテーブル変数を使用することにしました。

Step 1: insert into the table variable the "chunk" from the real table that I want to update.
Step 2: update the column in the table variable.
Step 3: delete the "chunk" from the real table.
Step 4: insert the table variable rows into the real table.

これにより、ロックに関する問題が解消され、チャンクが十分に大きくなく、実際にメモリ使用率に関する問題が発生することはありません。

この手順を SSIS で並行して実行することができ、使用したチャンクの数に比例して実行時間が短縮されることがわかりました。

于 2013-10-02T18:20:52.930 に答える