【问题标题】:SQL Server Performance ResultSet vs Output Parameter vs Return ValueSQL Server 性能结果集 vs 输出参数 vs 返回值
【发布时间】:2013-07-24 08:35:41
【问题描述】:

我正在权衡使用三种不同方法之一将单个标量值从存储过程返回到我的 C# 例程的潜在性能影响。谁能告诉我其中哪个“更快”,最重要的是,为什么?

方法一:

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

方法二:

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

方法三:

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

【问题讨论】:

    标签: sql performance return output resultset


    【解决方案1】:

    返回标量值比返回结果集更有效,原因是结果集带有更多的辅助方法,这使得它变得沉重,从而增加了对象从 sql 到 C# 代码/例程的传输延迟。

    在您的方法 3 中:您使用了一个变量来返回值,这比发送一个 out 参数更好,因为在这里您至少在一条路线上减少了对象的遍历(即,在调用存储过程时) .

    结果集比输出参数更灵活,因为它可以返回多行(显然),所以如果您需要结果集,那么无论如何它是唯一的选择。

    按照方法 3、方法 2、方法 1 的性能对查询进行排序。

    希望这有助于理解这个概念。

    【讨论】:

    • 另一种精度。使用方法 3 (RETURN),您仅限于 INTEGER 类型。如果要返回另一种数据类型,则应使用方法二或方法一。
    • 感谢所有帮助。就个人而言,我倾向于#2。但是,当我在 #2 和 #3 中都返回一个 INTEGER 时,我可以看到 #3 在哪里表现最好。如果我必须返回某种类型的字符串,我会使用#2。当然,如前所述,我只会在需要结果集时使用#1。
    【解决方案2】:

    在性能损失方面,方法 3 (RETURN) 是无损失的。原因是 SQL Server 将总是从存储过程返回整数结果代码。如果你没有明确指定一个,那么它会隐式返回 0 (SUCCESS)。

    【讨论】:

      【解决方案3】:
      CREATE PROCEDURE GetClientId 
         @DealerCode varchar(10)
      AS
      BEGIN
          SET NOCOUNT ON
          DECLARE @ClientValue INT=0;
          SELECT @ClientValue = 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-17
        • 2014-05-16
        • 2010-09-27
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        相关资源
        最近更新 更多