SQL Server 性能结果集与输出参数与返回值

标签 sql performance return output resultset

我正在权衡使用三种不同方法之一将单个标量值从存储过程返回到我的 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 到 C# 代码/例程的传输延迟。

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

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

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

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

关于SQL Server 性能结果集与输出参数与返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17841281/

相关文章:

sql - 树液哈纳 : function like "age" in PostgreSQL

sql - MaxLength 及其如何影响查询

c# - 使用 Linq 搜索任何单词

bash - 在 bash 中有效获取命令输出的一致语法?

c# - 如何在 C# 中返回一个 int 数组

sql - 德州扑克数据的关系数据库结构

SQL Azure存储过程超时问题

c# - 有什么方法可以分析 WCF 应用程序的性能吗?

c++ - 与 omp simd : when to use each? 并行

c# - 在许多条件下编写 return 语句的正确方法