在SQL中的多个if语句的性能(SQL Server 2008)



我想知道有许多存储过程或一个带有多个if-else分支的存储过程。

我了解SQL Server将根据存储过程的最新执行创建执行计划,因此下次执行存储过程时,具有不同的参数,该参数会导致IF语句中的不同路径,然后将编译和缓存不同的执行计划。

我的主管曾说过,他想减少我们环境中的存储程序数量,并指示我们将IF-ELSE语句使用我们所拥有数据的各个区域之间的情况。例如

if(@iso = 'Item1')
begin
    if(@type = 'A')
    begin
    end
    if(@type = 'B')
    begin
    end
    if(@type = 'C')
    begin
    end
end
if(@iso = 'Item2')
begin
    if(@type = 'A')
    begin
    end
    if(@type = 'D')
    begin
    end
end
if(@iso = 'Item3')
begin
    if(@type = 'B')
    begin
    end
    if(@type = 'E')
    begin
    end
end

执行此存储过程时,很可能每次都会提交不同的参数。这会导致许多数据库争论,因为执行计划正在不断再生?

我会为每个意图或目的投票给一个存储过程。在大多数情况下,存储程序具有,但目的是一个。这是有道理的。考虑"关注点的分离"或扎实的设计原则。它也将更容易维护。与更大或过度复杂性之一相比,理解和更改一些小的存储程序要容易得多。

如果您在上面描述的那样执行具有多个参数的大型存储过程,则必须针对参数嗅探和不良计划缓存的问题采取预防措施。这是布伦特·奥扎尔(Brent Ozar)的一篇不错的文章,在描述问题以及该如何处理方面做得很好。什么是参数嗅探?

最新更新