存储过程中的IF / ELSE性能

第一卷

我发现这篇文章解释了在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 *不是一种很好的做法。为了示例,我只是这样做了)

戈登·利诺夫(Gordon Linoff)

通常,尽管您应该看一下Mikael Eriksson引用的白皮书,该白皮书中有很多关于此主题的有用信息,但我不会为此担心。但是,我将Column1 = Column1else分支中删除该语句,因为这可能会使优化器混乱。

本文所指的是存储过程在第一次运行时就被编译的事实。这可能会导致错误的结果。例如,如果表在第一次调用时为空,则优化器可能更喜欢全表扫描而不是索引查找,并且随着表的变大,这样做会很糟糕。

问题可能是其中一个分支获得了次优的性能计划,因为在第一次调用时数据不是典型的。如果其中一个值为,则尤其如此NULL这不仅会在中发生if,而且在这种情况下,您需要对此问题保持敏感。

我建议以下内容:

  • 如果表随着时间增长/缩小,请定期重新编译存储过程。
  • 如果您的表代表数据,则不必担心拆分为多个存储过程。
  • 您的示例应进行索引查找,这非常简单。但是,请监视性能并检查执行计划,以确保它们是您想要的。
  • 如果要强制使用索引,则可以使用提示。(就个人而言,我需要强制使用特定联接算法的提示,但不需要使用索引,但是我敢肯定其他人会有不同的经历。)

为了您的例子,在索引table1(column1)table1(column2)应该足够了。

该建议的摘要除非您发现有问题,否则不解决此问题。把逻辑分为两个存储过程应该是固定的一个问题,你实际看到的,而不是可能永远存在先发制人的问题。如果确实采用了两种方法,则仍然可以使用一个接口来调用它们中的每个接口,因此您仍然具有相同的API。换句话说,一个过程应该变成三个而不是两个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

存储过程中的IF / ELSE性能

来自分类Dev

SQL Server:存储过程中的IF THEN ELSE

来自分类Dev

存储过程中动态游标的性能

来自分类Dev

复杂存储过程中的if-then-else构造

来自分类Dev

在存储过程中的 SELECT STATEMENT 中使用 IF ELSE CONDITION

来自分类Dev

如何通过性能优化在存储过程中执行排序和筛选?

来自分类Dev

一个存储过程中的多个DML语句会导致性能下降吗?

来自分类Dev

在存储过程中添加 if else 条件并返回硬编码值?

来自分类Dev

请求过程中Node JS的性能

来自分类Dev

如何在SQL Server存储过程中使用if / else

来自分类Dev

在存储过程中使用if / else进行计算

来自分类Dev

在过程中添加条件会导致性能下降

来自分类Dev

在存储过程中调用存储过程

来自分类Dev

存储过程中的更新

来自分类Dev

存储过程中的交易

来自分类Dev

存储过程中的递归

来自分类Dev

存储过程中的IF条件

来自分类Dev

存储过程中的SUM

来自分类Dev

存储过程中的if语句

来自分类Dev

#TempTable 在存储过程中

来自分类Dev

比较SQL Server中索引视图和存储过程的性能

来自分类Dev

无法在存储过程中调用存储过程

来自分类Dev

在存储过程中显示消息

来自分类Dev

Oracle存储过程中的表变量

来自分类Dev

更新存储过程中的死锁

来自分类Dev

存储过程中的多案例选择

来自分类Dev

在存储过程中调用dba表

来自分类Dev

存储过程中的COPY语句

来自分类Dev

在存储过程中返回位类型