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

第谷·布雷(TychoBrahe)

我想知道是否最好有许多存储过程,或者一个具有多个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

当执行此存储过程时,很可能每次都会提交不同的参数。随着执行计划的不断更新,这是否会引起大量的数据库争用?

罗伯·彼得森

我会为每种意图或目的投票支持一个存储过程。在大多数情况下,存储过程仅具有一个目的。这是有道理的。考虑“关注点分离”或SOLID设计原则。它也将更易于维护。与大的或过大的复杂性之一相比,它更易于理解和更改一些小的存储过程。

如果您按照上述方法对具有多个参数的大型存储过程进行了处理,则必须采取预防措施来防止出现参数嗅探和错误的计划缓存的问题。这是布伦特·奥扎(Brent Ozar)的一篇不错的文章,很好地描述了问题及其解决方法。什么是参数嗅探?

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章