在存储过程中,多个重复的IF语句与单个IF和循环

时间:2018-12-05 13:40:23

标签: sql-server tsql stored-procedures

我的存储过程中有以下IF语句:

IF @parameter2 IS NOT NULL
    BEGIN
        -- delete the existing data
        DELETE FROM @tab

        -- fetch data to @tab
        INSERT INTO @tab EXECUTE sp_executesql @getValueSql, N'@parameter nvarchar(MAX)', @parameter2
        SET @value2 = (SELECT * FROM @tab)

        IF @value2 = @parameter2
            RETURN 5
    END
ELSE
    RETURN 5

这是为了检查数据库中是否已经存在@parameter2值。现在我遇到的麻烦是我必须对多达10个参数执行此操作。我想知道仅复制语句并为所有可能的参数重复代码是否会更快。那意味着我有10个几乎相同的IF语句。我认为可能的另一种选择是将所有参数插入@tab并使用CURSORWHILE遍历它们。我担心循环的速度,因为据我所知它们非常慢。

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,这几乎是相同的。

独立光标很慢。但是,如果在代码中键入多个IF,则无法避免它们变慢的原因。本质上,您使用的是“展开形式”的游标;问题仍然存在:将重新创建过程的所有执行计划,并且优化程序将没有机会使用更好的基于集合的计划。

因此,您的选择是:

  1. 使用多个IF的游标。为了便于阅读和方便,我建议使用光标。表现会一样
  2. 如果可能,请重新编写@getValueSql的代码以支持不对@parameterN的一个值进行操作,而是对具有N行的参数表进行操作,每个参数值对应一个重新感兴趣。这可能很难或不可能做到,但这是提高性能的唯一方法。

但是,我还应该提到,游标的缺点仅在10次迭代中就不会很明显,除非您有异常复杂和嵌套的查询。请记住,“过早的优化是万恶之源”。最可能的事情是您不必为此担心。