2008-09-17 13 views
5

カーソルをループしているSQL Server 2005のストアドプロシージャを1時間に1回実行する必要があり、実行に約5分かかりますが、プロセッサ時間が膨大にかかるという問題があるとします。WAITFORコマンド

編集:残念ながら、私は行をベースに他のストアドprocs /クエリを処理して実行しなければならない場合、カーソルを削除します。

フェッチする前にWAITFOR DELAY '0:0:0.1' をSQLのバージョンの.NetのThread.Sleepとして使用する前に使用できますか?したがって、このプロシージャの実行時間を犠牲にして、他のプロセスをより速く完了させることができます。

他にも私には見えない解決策がありますか?

ありがとうございました

答えて

4

が実際にそれを遅くし、他のものはより速く行くことができるでしょうチェックしてください。また、カーソルの代わりにWHILEループを考えるかもしれません - 私の経験では、より速く実行されます。カーソルを早送りの読み取り専用カーソルに移動することも考えられます。これは、どれだけのメモリを占有するかを制限します。

declare @minid int, @maxid int, @somevalue int 
select @minid = 1, @maxid = 5 
while @minid <= @maxid 
begin 
    set @somevalue = null 
    select @somevalue = somefield from sometable where id = @minid 
    print @somevalue 
    set @minid = @minid + 1 
    waitfor delay '00:00:00.1' 
end 
1

問題が解決するかどうかはわかりません。 IMHOカーソルのパフォーマンス上の問題は、データセットを常駐させてループさせるために使用するメモリの量になります。ループ内でwaitforを追加すると、リソースが長く消費されます。

しかし、ここで間違っているかもしれませんが、私はどちらの条件でもperfmonを使用してサーバーのパフォーマンスを確認し、待機を追加するかどうかを判断します。

タグを見ると、私はあなたがMS SQL Serverを使用していると仮定していますが、他の味のものではありません。

0

手順を遅らせることもできますが、それはあなたを助けるかもしれません。プロシージャの仕組みによって異なります。それはトランザクションで、なぜカーソル(SQL Serverではひどく非効率的です)、どこが減速などですか?プロシージャをおそらく再加工するほうが理にかなっています。

0

SQL 2005にはウィンドウ機能やその他の機能が組み込まれて以来、ほとんどの場合、カーソルを削除することができました。おそらくあなたの問題は、カーソルそのものを取り除くことによって最も効果的でしょうか?

確かにループ内WAITFORを置くランキング関数http://msdn.microsoft.com/en-us/library/ms189798.aspxと集計ウィンドウ関数http://msdn.microsoft.com/en-us/library/ms189461.aspx

0

私はあなたが持っているコードは、他のプロセスがカーソルが派生したテーブルにアクセスできないということを推測しています。

カーソルをREADONLY FASTWORDにすると、カーソルが派生したテーブルをロックしないでください。

しかし、書き込みが必要な場合は、WAITFORは役に立ちません。テーブルをロックするとロックされます。

オプションは、テンポラリテーブルにテーブルをスナップショットし、その代わりにカーソル/ループを実行することです。その場合、基になるテーブルはロックされませんが、スナップショットを処理している間にテーブルが変更される可能性があります。

デモ