10

ストアド プロシージャから C# ルーチンに 1 つのスカラー値を返す 3 つの異なる方法のいずれかを使用した場合の潜在的なパフォーマンスへの影響を比較検討しています。これらのうちどれが「より速い」のか、そして最も重要なのはその理由を誰か教えてもらえますか?

方法 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
4

3 に答える 3

7

スカラー値を返すことは、結果セットよりも効率的です。その理由は、結果セットがより多くのヘルパー メソッドを運ぶため、結果セットが重くなるため、SQL から C# コード/ルーチンへのオブジェクトの転送でレイテンシが増加するためです。

メソッド 3: 変数を使用して値を返しました。ここでは、少なくとも 1 つのルートでオブジェクトのトラバースを削減しているため (つまり、ストアド プロシージャを呼び出すとき)、これは out パラメータを送信するよりも優れています。

結果セットは (明らかに) 複数の行を返すことができるため、出力パラメーターよりも柔軟です。

方法 3、方法 2、方法 1 のように、パフォーマンスに基づいてクエリを並べ替える。

これが概念を理解するのに役立つことを願っています。

于 2013-09-05T14:01:39.943 に答える