我的存储过程中有以下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
并使用CURSOR
或WHILE
遍历它们。我担心循环的速度,因为据我所知它们非常慢。
答案 0 :(得分:1)
正如评论中所提到的,这几乎是相同的。
独立光标很慢。但是,如果在代码中键入多个IF
,则无法避免它们变慢的原因。本质上,您使用的是“展开形式”的游标;问题仍然存在:将重新创建过程的所有执行计划,并且优化程序将没有机会使用更好的基于集合的计划。
因此,您的选择是:
@getValueSql
的代码以支持不对@parameterN
的一个值进行操作,而是对具有N行的参数表进行操作,每个参数值对应一个重新感兴趣。这可能很难或不可能做到,但这是提高性能的唯一方法。但是,我还应该提到,游标的缺点仅在10次迭代中就不会很明显,除非您有异常复杂和嵌套的查询。请记住,“过早的优化是万恶之源”。最可能的事情是您不必为此担心。