2013-07-24 18 views
5

ストアドプロシージャからスカラー値を単一のC#ルーチンに返す3つの異なる方法のいずれかを使用すると、パフォーマンスに与える影響を考慮する必要があります。誰がこれらのどれが「より速く」、そして最も重要なのはなぜですか?SQL ServerパフォーマンスResultSetと出力パラメータと戻り値

方法1:

CREATE PROCEDURE GetClientId 
    @DealerCode varchar(10) 
AS 
BEGIN 
    SET NOCOUNT ON 
    SELECT ClientId 
     FROM Client 
     WHERE ClientCode = @DealerCode 
END 
-- this returns null if nothing is found, 
-- otherwise it returns ClientId in a ResultSet 

方法2:

CREATE PROCEDURE GetClientId 
    @DealerCode varchar(10), 
    @ClientValue int out 
AS 
BEGIN 
    SET NOCOUNT ON 
    set @ClientValue = -1 
    set @ClientValue = (SELECT ClientId 
     FROM Client 
     WHERE ClientCode = @DealerCode) 
END 
-- this returns -1 for ClientValue if nothing is found, 
-- otherwise it returns ClientId 
-- the value for ClientValue is a scalar value and not a ResultSet 

方法3:スカラー値を返す

CREATE PROCEDURE GetClientId 
    @DealerCode varchar(10) 
AS 
BEGIN 
    SET NOCOUNT ON 
    declare @ClientValue int 
    set @ClientValue = 
     (SELECT ClientId FROM Client WHERE ClientCode = @DealerCode) 
    if @ClientValue is null or @ClientValue = 0 
     return -1 
    else 
     return @ClientValue 
END 
-- this uses the return value of the stored procedure; 
-- -1 indicates nothing found 
-- any positive, non-zero value is the actual ClientId that was located 

答えて

2

結果セットよりも効率的であり、その理由は、その結果でありますsetはそれに伴ってさらに多くのヘルパーメソッドを持ちます。それはobjの送信における待ち時間を増やしますSQLからC#コード/ルーチンへの影響

あなたの方法では、値を返すために変数を使用しました。ここでは、1つのルートでオブジェクトの少なくとも1つのトラバースを削減しているので(つまり、ストアドプロシージャを呼び出すときに) )。

結果セットは、複数の行(明らかに)を返すことができるため、出力パラメータより柔軟です。したがって、結果セットが必要な場合は、それは唯一の選択肢です。

方法3ようになり、パフォーマンスに基づいてクエリを注文するには、方法2方法1.

希望これは、概念を理解するのに役立ちます。

+1

もう1つの精度。方法3(RETURN)では、INTEGER型に制限されています。別のデータ型を返す場合は、方法2または方法1を使用する必要があります。 –

+0

すべてのヘルプに感謝します。個人的には、私は#2に向かっていました。しかし、#2と#3の両方でINTEGERを返すので、#3が最高のパフォーマンスを持つ場所を確認することができました。いくつかのタイプの文字列を返さなければならない場合は#2を使用します。もちろん、以前に規定されているように、結果セットが必要な場合に限り#1を使用します。 –

関連する問題