SQL (Sql Server 2008) 中多分支 If 语句的性能

Performance of Multi-branch If Statement in SQL (Sql Server 2008)

我想知道是拥有多个存储过程更好,还是一个存储过程具有多个 if-else 分支更好。

我了解到SQL服务器会根据最近一次执行存储过程来创建执行计划,所以下次执行存储过程时,使用不同的参数会导致不同的路径在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

执行这个存储过程的时候,很有可能每次都会提交不同的参数。由于不断重新生成执行计划,这是否会引起大量数据库争用?

我会为每个意图或目的投票支持一个存储过程。在大多数情况下,存储过程只有一个目的。这是有道理的。思考 "separation of concerns" 或 SOLID 设计原则。它也将更容易维护。理解和更改一些小的存储过程要比理解和更改一个更大或过于复杂的存储过程容易得多。

如果您像上面描述的那样使用多个参数执行大型存储过程,则必须采取预防措施来防止参数嗅探和错误的计划缓存问题。这是 Brent Ozar 撰写的一篇不错的文章,它很好地描述了问题以及如何解决它。 What is Parameter Sniffing?