2011-12-08 7 views
0

現在、私はSQL Serverでもう少し作業しなければならず、多くのリソースを使用しているため、カーソルが遅いために、カーソルとその回避方法を読んだことがあります。この場合、カーソルよりも「中」の方が速いのはどうでしょうか?

今私はカーソルでいくつかの基本的なことをやろうとし、whileループで再構築しようとしました。最後に、カーソルはwhileループよりも10倍高速でしたが、リソースは約60〜40%でした。

私は奇妙な例題の演習をしている可能性がありますか?

これは私が自分自身を与えた運動についてです:「名前」、約1000名を含む:テーブルを

  • 反復、このテーブルは、1つの列があります。
  • それぞれの名前を個別に印刷します。

カーソルではかなり簡単ですが、whileループではカウンタが必要です。テーブルにインデックスがないので、私はそれを使用することはできません。だから、私の解決策は、私は一時テーブルを作成し、テーブルにすべての名前を追加し、インデックス(または行番号)を含めることでした。しかし、挿入操作には約95%の時間がかかり、最後にwhileループはカーソルより遅くなります。

編集:私は試み
もう一つはWITH Names_Rows AS...を使用するようにし、カラムとしてRow_Number()を添加し、次いでNames_Rows構築を反復するwhileループを使用します。しかしそれはもっと長くかかった。

インデックスを使用しないでテーブルを繰り返し処理する方法が簡単ではありませんでしたか?

+0

リストをループして各名前を個別に印刷するという作業は、通常はデータベース内で実行されません。それは通常UIで行われます。私たちは一般的に物事をループしたり、一度に1つのレコードで操作を実行したりしません。代わりに、私たちはセットの点で物事を考え、セットで操作を実行します。 – DOK

+0

@DOK:私の小さな「エクササイズ」は典型的ではないかもしれませんが、データベース上のテーブルを直接ループする必要がある現実の状況に基づいています。 – Feroc

+1

テストコードを記入してください。どのようなビジネス上の問題をシミュレートしようとしていますか?テーブル内のすべての行を取得するには、select * from tableNameを使用します。 – Paparazzi

答えて

4

カーソルを避ける理由は、宣言セットに基づく操作ではなく、一度に必須の行を実行するためです。

カーソルをwhileループに置き換えても、それ自体が魔法のようにパフォーマンスが向上することはなく、パフォーマンスが悪化する可能性があります。 2つのパフォーマンスの違いは、正確なコード/テーブル構造と選択するカーソルオプションによって異なります。as covered in this series of articlesより多くのセットベースの方法で

テーブルからすべての名前をプリントアウトするには、あなたが

DECLARE @Names nvarchar(max); 

SELECT @Names = ISNULL(@Names + ' 
','') + Names 
FROM YourTable; 

PRINT @Names; 
+0

記事をありがとう、もう1つはあなたから良い。あなたの例はもちろん、同じ出力をはるかに高速に持っていますが、すべての名前を別々に印刷する必要があるため、元の問題は解決しません(この例では意味をなさない)。 – Feroc

0

を行うことができ、テーブル内の特定の列の各値に対して関数を実行する最も簡単な方法は次のとおりです。

select MyFunction(ColumnName) from TableName 
関連する問題