我发现这篇文章解释了在SP中使用IF / ELSE语句可能会导致与为每个“分支”使用单独的SP相比,性能降低。http://sqlmag.com/t-sql/if-statements-and-stored-procedure-performance
但是我有一个SP,它从相同的表中选择相同的列,并且仅WHERE子句根据存在的变量而变化。这是一个例子:
IF @Variable1 IS NOT NULL
BEGIN
SELECT
*
FROM
dbo.Table1
WHERE
Column1 = @Variable1
END
ELSE IF @Variable1 IS NULL AND @Variable2 IS NOT NULL
BEGIN
SELECT
*
FROM
dbo.Table1
WHERE
Column1 = Column1
AND
Column2 = @Variable2
END
因此,在此示例中,最好有2个单独的SP来处理不同的变量,还是可以像这样将它们全部合并在一起?(我知道使用SELECT *
不是一种很好的做法。为了示例,我只是这样做了)
通常,尽管您应该看一下Mikael Eriksson引用的白皮书,该白皮书中有很多关于此主题的有用信息,但我不会为此担心。但是,我将Column1 = Column1
在else
分支中删除该语句,因为这可能会使优化器混乱。
本文所指的是存储过程在第一次运行时就被编译的事实。这可能会导致错误的结果。例如,如果表在第一次调用时为空,则优化器可能更喜欢全表扫描而不是索引查找,并且随着表的变大,这样做会很糟糕。
问题可能是其中一个分支获得了次优的性能计划,因为在第一次调用时数据不是典型的。如果其中一个值为,则尤其如此NULL
。这不仅会在中发生if
,而且在这种情况下,您需要对此问题保持敏感。
我建议以下内容:
为了您的例子,在索引table1(column1)
和table1(column2)
应该足够了。
该建议的摘要除非您发现有问题,否则不解决此问题。把逻辑分为两个存储过程应该是固定的一个问题,你实际看到的,而不是可能永远存在先发制人的问题。如果确实采用了两种方法,则仍然可以使用一个接口来调用它们中的每个接口,因此您仍然具有相同的API。换句话说,一个过程应该变成三个而不是两个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句