【问题标题】:SQL Server - Individual Procedures vs. Single ProcedureSQL Server - 单个过程与单个过程
【发布时间】:2009-03-19 11:05:36
【问题描述】:

在我正在开发的系统中,我可以选择使用单个存储过程来执行三个相关的作业并且不返回任何结果,或者返回相同的结果集,但来自两个不同的表。

我昨天读到一篇文章,建议存储过程应该只有一个执行计划,并且任何根据参数差异更改其执行计划的过程都应该写成多个过程。

将过程编写为三个不同的过程会改变执行过程的系统的操作方式,但不会以任何重大方式。

我想知道的是,根据输入与单个过程没有不同执行计划的过程所获得的性能是否值得付出努力,即调用数据库的开销是否比调用数据库的开销大三倍必须根据情况重新编译性能计划的开销?

谢谢

格雷格

【问题讨论】:

    标签: sql-server performance stored-procedures


    【解决方案1】:

    您可能会考虑编写三个单独的存储过程,然后从单个存储过程中调用它们。

    【讨论】:

    • 额外加分,这个设计模式的名称是什么?
    • 哈哈,记住这些名字我很垃圾。我确实了解工厂模式和 SOLID 原则,但尽管这个概念仍然存在,但通常必须通过谷歌搜索来回忆这个名称
    • 为了干净利落的堆栈溢出,您可能应该编辑自己的答案以揭示这个难以捉摸的模式名称
    • 对设计模式了解不多,所以不知道您指的是哪一种。但是,一个包含 3 个部分的程序又如何呢?我以前见过这样做,但我自己从来没有这样做过,因为可维护性似乎已经消失了,而且有点令人困惑。
    • 有问题的过程乘以系统中的对象数量。 10 个对象 = 40 个程序,100 个对象,你就明白了。我认为维护将成为最重要的因素。
    【解决方案2】:

    Chris Simpson 正确地认识到我留给他命名的设计模式的适用性。应用这种模式最直接的好处是简单,它易于验证(测试)和易于维护。

    可能有性能提升,但这是不可预测的。有时复杂性会使查询计划优化器感到困惑。将您的 über 方法分解为几个更简单的特定于案例的策略(向 Chris 提示)可能减少由于对非常大的决策树进行积极修剪而导致的错误,并且它还可能允许 每个案例 优化。当“特殊”情况实际上非常典型时,这可能非常有益。

    尽管如此,提高可验证性和可维护性本身就是值得称赞的目标。

    【讨论】:

      【解决方案3】:

      除非某些功能段有可能被系统的其他区域重用,否则我实际上建议坚持使用 1 个存储过程。

      根据经验,您拥有的 SP 越多,需要维护的东西就越多(我觉得每个 SP 有一点开销,除了 SP 中包含的内容)。

      【讨论】:

      • 没有一个功能段是可重用的,这有助于回答我的问题。然而,这些过程将针对我系统中的各种对象重复,但没有可应用于例程的概括。
      • 因此意味着我最终会有多个程序,我可以有一个。可维护性会因此而降低。
      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多