2012-01-10 18 views
1

以下のSQLおよび動的SQLでカーソルが使用されています。プロファイルはかなりの実行計画を持ち出し、私はこのカーソルに対処しなければならないと思います。これはSQLの悪い選択ですか?ストアドプロシージャのパフォーマンス問題のカーソル

SET @SelectStmtSubHeader = 'SELECT DISTINCT 
     dbo.dsb_testID(sh.GPCustomerID) AScursor -- RIGHT HERE 
     PONumber, 
     sh.GPCustomerID, 
     ..... 

答えて

4

から良い例です。カーソルがあることが必要

...

DECLARE this_is_a_cursor CURSOR 
FOR 
    SELECT 
    stuff 
    FROM 
    a_query 

あなたが示されてきたスニップコードは、それが言葉cursorに別名値を、導出するスカラー関数を使用して表示されます。しかしcursorというフィールドを持っていても、それはカーソルにならない。

+0

+1それはカーソル笑ではないことを考え出すために私から。私はその質問に答え、あなたは疑問を証明した:p – Jordan

3

代替ロジックがセットロジックに存在する場合、カーソルはほとんどの場合避けるべき悪い選択です。

SQLは設定されたロジックに基づいています。それらはコレクションのように繰り返されることを意図していません。

SQLオプティマイザは、通常、データを取得するための巧妙な方法を見つけるのに非常に優れています。カーソルは比較的単純ではありません。 ANSI SQLはそれを必要とするので、通常は存在します。

は、ここでは、カーソルの例ではありませんSybaseの

Cursor Performance Example

+0

このような絶対的な言葉は私を震わせさせる。 CURSORには常にパフォーマンスのオーバーヘッドがありますが、オーバーヘッドが代替ではないシナリオがあります。たとえば、SQLで合計を実行してみてください。 *純粋なプログラマーによって頻繁に不適切に使用されるため、普遍的な悪影響を及ぼすことはありません。* – MatBailie

+0

十分に公正です。私が与えたリンクはSybaseから来たものですが、気をつけてください。私は彼らが良い情報源だと思うだろうとDBのメーカーであると基本的にあなたがそれを使用する代替を持っていると言った。それは私の投稿を編集すると言われている;) – Jordan

+0

+1の単語 'ほとんど'のために:) – MatBailie

関連する問題