2011-11-13 45 views
0

データを処理するときに手続き型プログラミングが絶対に避けられないことがあります。カーソルは本当に「正しい」選択肢ですか?

私は現在、いくつかのレガシーコードの最適化に取り組んでいます。それはIF/ELSEステートメントとBEGIN/ENDなどの63ペアのカーソルを使用します。私はカーソルをリバースエンジニアリングして手続きプロセスにしたいと考えていました。今私はアルゴリズムの解読の終わりにあり、実現しています。 。 。 ooops ...それを持っていますが、レコード上の各選択は、前のすべてのレコードのプロセスの結果によって決まるため、手続き的です。

これで私は破損しています... SQL Server処理(CLR SP、UDFなど)でプロシージャコードを混合するための選択肢があります。私は仕事のための適切なツールを使用することを大いに信じているので、私はこれのために.NET CLR SPを作ることに傾いています。しかし、カーソルをちょっと単純化する方が速くて簡単ですが、まだをカーソルにしておきます。

あなたはどう思いますか? SQL Serverを使用して.NETモジュールにアクセスできるようになったので、カーソルを使用することはもう適切ではありませんか?

答えて

2

SQLサーバーでは、少なくともグローバル一時テーブルとテーブル変数の両方がありますが、サーバー側のカーソルを使用するシナリオは想定できません。従来のアプリで発見したように、すべてのコードを設定ベースにすることはできませんが、手続き的にレコードを反復処理する必要がある場合でも、カーソルは最悪の選択肢です。例えばのためのテーブル変数を使用して

、 (そして、このアプローチは非常に大きなテーブルセットのパフォーマンスに低下し始め)

Declare @Pks Table (pk integer primary key not null) 
Insert @pks(pk) 
Select pkcolName from table where ... [here put logic to 
      extract id values for rows you need to iterate over 

-- then put procedural code here ... 
Declare @pk Integer 
While Exists (Select * From @pks) Begin 
    Select @pk = Max(pk) From @pks -- assuming you need to work 
          -- on pk values from highest to lowest 
    // Here do work on one record at a time, using value in @pk 
    Delete @pks Where pk = @pk 
End 
+0

カーソル以外の手続き的な反復処理にはどのようにお勧めしますか?そして、いいえ、これは手続き的でなければなりません。私はこれについて多くのことを考え、それを切り裂き、セットベースで行う方法はありません。 – richard

+0

悪い例を追加 –

+0

[これは、正しいオプションが指定されたカーソルを使用するより効率的ではないとは思っていません](http://bradsruminations.blogspot.com/2010/05/truth-about-cursors-part-1。 html) –

0

私は何でもクライアント/アプリケーションサーバー上のC#でループを実行します必要に応じてストアドプロシージャを呼び出します。通常、C#は開発や単体テストの方がはるかに高速で簡単ですが、CLRを使用してもデータベース内のすべての処理を行うストアドプロシージャよりも高速に実行できます。

関連する問題