我正在权衡使用三种不同方法之一将存储过程中的单个标量值返回到我的C#例程对性能的潜在影响。有人能告诉我其中哪一个"更快"吗?最重要的是,为什么?
方法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
返回标量值比结果集更有效,原因是结果集携带了更多的辅助方法,这使得它很重,从而增加了对象从sql到C#代码/例程的传输延迟。
在方法3中:您使用了一个变量来返回值,这比发送一个out参数要好,因为在这里您至少在一个路由中减少了对对象的遍历(即,调用存储过程时)。
结果集比输出参数更灵活,因为它可以返回多行(显然),所以如果您需要结果集,那么它是唯一的选择。
要根据性能对查询进行排序,请按照方法3、方法2和方法1执行。
希望这对理解这个概念有帮助。
在性能惩罚方面,方法3(RETURN)是免费的。原因是SQL Server将始终从存储过程返回整数结果代码。如果您没有显式指定一个,那么它将隐式返回0(SUCCESS)。
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