2

いくつかのテーブルのデータを含む値を計算する必要があります。カーソルでストアドプロシージャを使用すると、データセットにデータを読み込んで(単純な選択ストアドプロシージャを使用して)レコードをループする場合に比べて、パフォーマンスが向上するのではないかと思いました。データセットは大きくなく、6つのテーブルで構成され、各テーブルには約10個のレコードがあり、主にGUID、いくつかのnvarchar(100)フィールド、float列、およびnvarchar(max)があります。

4

4 に答える 4

2

これは、取得するデータセットによって異なる可能性があります(セットが大きいほど、SQL Serverを渡すのではなく、SQL Server内で実行する方が論理的です)が、計算を実行する場合は、コード内で、ストアドプロシージャから離れて実行してください。カーソルを使用してデータをまとめる必要がある場合はそうですが、カーソルを使用して計算やその他の非取得機能を実行することは避けたほうがよいと思います。

編集:別の関連する質問に対するこの回答は、カーソルとループの長所と短所を示します。この答えは、スケーリングに関する私の以前の主張(上記を読んだ)と矛盾するように思われます。大きくなるほど、ストアドプロシージャではなく、コードに移動したくなることを示唆しているようです。

于 2009-04-29T14:19:49.720 に答える
1

カーソルは高速である必要がありますが、多数のユーザーがこれを実行している場合、サーバー リソースが消費されます。SQL ではなく .Net でループを記述する場合は、より強力なコーディング言語があることに注意してください。

標準セット ベースの SQL を使用してカーソルを置き換えることができない場合はほとんどありません。サーバー上でこの操作を行っている場合は、セットベースの操作を使用できる場合があります。あなたがしていることについての詳細はありますか?

カーソルを使用する場合は、FAST_FORWARD 読み取り専用カーソルが最高のパフォーマンスを発揮することを念頭に置き、deallocate ステートメントを使用してカーソルを解放してください。カーソルのヒントこちら

于 2009-04-29T14:33:01.780 に答える
1

カーソルの代替

declare @table table (Fields int)
declare @count int
declare @i

insert inot @table (Fields)
select Fields
from Table


select @count = count(*) from @table

while (@i<=@count)
begin


--whatever you need to do
set @i = @i + 1

end
于 2009-04-29T14:56:59.210 に答える
0

カーソルは高速である必要があります(ADO.NETではなくSQLで何か奇妙なことをしている場合を除く)。

とは言うものの、少し手間をかけるだけでカーソルを削除できることがよくあります。あなたがする必要がある手順は何ですか?

乾杯、
エリック

于 2009-04-29T14:18:39.223 に答える