【问题标题】:Calling sp and Performance strategy调用 sp 和性能策略
【发布时间】:2011-02-04 09:24:13
【问题描述】:

我发现自己处于必须在数据库中创建新 sp 和创建中间层代码之间做出选择的情况。所以浪费了一些宝贵的开发时间。该过程也可能包含一些连接。

或者使用两个已经存在的 sp(s),这种方法的问题是我要对数据库进行两次往返。这可能会导致性能不佳,尤其是如果我在另一台服务器上有数据库。

您将采用哪种方法?为什么?

谢谢

【问题讨论】:

    标签: asp.net sql-server performance architecture


    【解决方案1】:

    您在这里确实没有提供足够的信息。

    一般来说,我会选择单 SP 方法,除非它实际上是您从数据库中检索的两个非常不同的东西。我认为存储过程应该遵循单一职责原则,就像你的类一样。

    两次往返数据库服务器通常不会有问题;但当然这取决于它的使用方式。例如,您是否需要在每次请求时检索数据?性能很关键吗?它是否在紧密循环中使用? (希望不是 :-)

    【讨论】:

      【解决方案2】:

      您已经自己回答了这个问题。两次往返的效率会低得多,应该避免。

      如果你没有太多时间,你也许可以创建一个新的 SP 来调用其他两个 SP。

      如果创建调用新 SP 的代码真的很慢,而且人们都在回避它,那么您可能想从整体上质疑您的架构。

      【讨论】:

      • “如果创建调用新 SP 的代码真的很慢,而且人们都在回避它,那么您可能想从整体上质疑您的架构。” = +1
      • 我认为我们的主要策略是“做它”。我不喜欢它,我说我们上线时会有麻烦但没人听,我们会看到两周后会发生什么;)
      • 我一直在从事这样的项目,您可能会发现支持压力很大! :)
      【解决方案3】:

      请记住,即使您有两个单独的 SP 并且您想将结果连接在一起,也没有简单的方法可以在第三个 SP 的服务器端执行此操作。您可以将它们分别插入到一个临时表中,然后加入这些临时表。

      您还可以从两个 SP 复制代码并将它们组合以生成所需的结果集 - 可能会导致一些逻辑重复和维护问题。

      或者,正如您所说,您可以在客户端进行。如果两个 SP 分别返回的信息比您希望一起返回的信息多得多,那么开销并不可怕(如果您可以从客户端异步生成它们然后一起处理它们,实际上效率会相当高)

      所以在任何情况下,您都必须进行一些至少意义不大的编码和测试。

      因此,我强烈建议您考虑将两个原始 SP 更改为表值函数(如果可能,内联)。然后两个原始 SP 可以从 UDF 中提取,新 SP 可以加入两个 UDF,就像您连接表或视图一样。从代码复制的角度以及从重用和语义的角度来看,它是最简单的 SP 连接机制 - UDF 代码相对容易阅读、使用和重用 - 它们基本上像参数化视图一样工作。此外,优化器倾向于很好地处理内联 TVF。在某些复杂的 SP 情况下 TVF 根本无法工作,但对于大部分场景,它们非常强大且高效。一个非常成功的功能,可以在任何 SQL Server 系统架构中提供显着帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多