SQL Server 2000 ジョブのパフォーマンスを向上させようとしています。シナリオは次のとおりです。
テーブルA
には最大があります。300,000行。100行目を更新/削除すると(挿入時間に基づいて)、その行の後に追加されたすべての行が値を更新する必要があります。行番号 101 は、行番号に基づいて値を更新する必要があります。100と行番号。102 は、行番号 101 の更新された値に基づいてその値を更新する必要があります。例えば
古いテーブル:
ID...........Value
100..........220
101..........(220/2) = 110
102..........(110/2)=55
......................
行番号 100 が新しい値 300 で更新されました。
新しいテーブル
ID...........Value
100..........300
101..........(300/2) = 150
102..........(150/2)=75
......................
実際の値の計算はより複雑です。式は簡単にするためのものです。
現在、トリガーは update/delete ステートメントに対して定義されています。行が更新または削除されると、トリガーによって行のデータがログ テーブルに追加されます。また、更新/削除後にコード ビハインドで SQL ジョブが作成され、最終的にテーブルの次のすべての行を反復してそれらの値を更新するストアド プロシージャが起動されA
ます。このプロセスは、300,000 行の場合、完了するまでに約 10 日かかります。
SP が起動されると、次の行の値が更新されます。これにより、SP の更新ごとにトリガーが再度実行され、これらの行もログ テーブルに追加されると思います。また、お客様のご要望に応じてDB側での作業となります。
この問題を解決するには:
ストアド プロシージャを変更し、トリガーから直接呼び出します。その後、ストアド プロシージャはトリガーを削除し、次の行の値を更新してから、トリガーを再度作成します。
- プログラムの複数のインスタンスが同時に実行されます。SP の実行中に別のユーザーが行を変更すると、システムはトリガーを起動せず、困ったことになります。これに対する回避策はありますか?
- このソリューションについてどう思いますか? これを達成するためのより良い方法はありますか?
ありがとうございました。