2

数時間ごとにバッチ処理して送信する必要がある情報を格納する単一のテーブルがあります。このテーブルの各行は、バッチ処理が必要な 1 つのアイテムに対応しています。数時間ごとに、すべての新しい行に対してクエリを実行しますwhere the state = 'New'

これらの行のバッチ処理を開始するときに、行の状態を「バッチ処理中」に設定し、バッチ処理が完了したら、状態を「完了」に設定したいと考えています。

次の SQL はより効率的ですか。

   UPDATE BatchTable SET state = <random number> where state = 'New';
   SELECT * from BatchTable where state = <random number>;

最初に行うUPDATEことで、2 つのスレッドが SELECT を実行し、別のスレッドが行のバッチ処理/更新を行っている間にブロックされることに対処しなければならない状況を回避できますか? を実行するUPDATEと、他のスレッドからのブロックを回避できますか?

これを行うためのまったく異なる、より良い方法はありますか?

4

1 に答える 1

1

ご懸念をお察しいたします。select ステートメントの実行中に、select ではなく更新によって捕捉される新しい行が追加される可能性があります。だから...あなたの方法は、テストに3番目の値を導入することで、ここで最も簡単です。あなたが遊ぶことができるもう一つのこと、そして私はそれをあまり使っていないので私の謝罪は: OUTPUT 句です:http://msdn.microsoft.com/en-us/library/ms177564.aspx。これにより、select ステートメントから更新を行い、値を取得できるようになります。すべて 1 つのステートメントで実行できると思います。

于 2013-02-06T23:37:30.217 に答える