当前位置: 首页 > 面试题库 >

SQL Server性能ResultSet vs输出参数vs返回值

戚飞雨
2023-03-14
问题内容

我正在权衡使用从存储过程向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的性能对查询进行排序。

希望这有助于理解概念。



 类似资料:
  • 出于我无法控制的原因,我必须在我的C代码中实现这个函数: 调用此函数时,编译器是否忽略它,或者是否仍然进行调用?例如: 两行代码的执行时间是相同的,还是第一行需要更长的时间?

  • 我在下面有一个函数,它的目的是返回第一个索引,其中数据不是按升序排序的。如果对数据进行排序,它将只返回数组的长度。例如,{10,20,90,5,70}将返回3(90 测试用例:

  • 问题内容: 通常,当使用嘲笑我会做类似 是否可以按照以下方式做点什么? 因此,而不是仅使用参数来确定结果时。它使用参数内的属性值来确定结果。 因此,在执行代码时,其行为如下 当前的解决方案,希望可以提出更好的建议。 问题答案: 这是一种方法。这使用一个对象来检查属性的值。 我实际上更喜欢另一种语法,它可以实现完全相同的效果。由您选择其中之一。这只是方法-测试类的其余部分应与上述相同。

  • 我正在玩新的Android设计库。折叠工具栏布局完美运行。但是,我无法将工具栏的默认状态设置为折叠。 我正在尝试实现这里和这里显示的解决方案 我在我的活动摘要中调用以下代码: 但是,params返回的行为为null。我的xml代码和这里一样,除了我没有使用drawer和CordinatorLayout是我的根布局。 编辑:我之前尝试过切换AppBarLayout。AppBarLayout的行为。S

  • 问题内容: 什么都不做也不返回什么的方法的Java 8功能接口是什么? 即,是否等效于带有返回类型的C#无参数? 问题答案: 如果我正确理解的话,你想要一个具有方法的功能接口。在这种情况下,您只需使用即可。

  • 我正在学习nodejs和mongodb,并获得平均应用程序 我的系统规格是 Ubuntu 16.04(64位) 节点v 6.1.0 npm v 3.8.6 "mongodb":"^2.1.18", "猫鼬":"^4.4.16"," 到目前为止,我已经创建了模式,并通过终端使用在mongob集合中添加了一个条目,并使用获得生成的文档_id。 db。位置。查找()。终端中的pretty()返回低于输出