【发布时间】:2011-02-04 09:24:13
【问题描述】:
我发现自己处于必须在数据库中创建新 sp 和创建中间层代码之间做出选择的情况。所以浪费了一些宝贵的开发时间。该过程也可能包含一些连接。
或者使用两个已经存在的 sp(s),这种方法的问题是我要对数据库进行两次往返。这可能会导致性能不佳,尤其是如果我在另一台服务器上有数据库。
您将采用哪种方法?为什么?
谢谢
【问题讨论】:
标签: asp.net sql-server performance architecture
我发现自己处于必须在数据库中创建新 sp 和创建中间层代码之间做出选择的情况。所以浪费了一些宝贵的开发时间。该过程也可能包含一些连接。
或者使用两个已经存在的 sp(s),这种方法的问题是我要对数据库进行两次往返。这可能会导致性能不佳,尤其是如果我在另一台服务器上有数据库。
您将采用哪种方法?为什么?
谢谢
【问题讨论】:
标签: asp.net sql-server performance architecture
您在这里确实没有提供足够的信息。
一般来说,我会选择单 SP 方法,除非它实际上是您从数据库中检索的两个非常不同的东西。我认为存储过程应该遵循单一职责原则,就像你的类一样。
两次往返数据库服务器通常不会有问题;但当然这取决于它的使用方式。例如,您是否需要在每次请求时检索数据?性能很关键吗?它是否在紧密循环中使用? (希望不是 :-)
【讨论】:
您已经自己回答了这个问题。两次往返的效率会低得多,应该避免。
如果你没有太多时间,你也许可以创建一个新的 SP 来调用其他两个 SP。
如果创建调用新 SP 的代码真的很慢,而且人们都在回避它,那么您可能想从整体上质疑您的架构。
【讨论】:
请记住,即使您有两个单独的 SP 并且您想将结果连接在一起,也没有简单的方法可以在第三个 SP 的服务器端执行此操作。您可以将它们分别插入到一个临时表中,然后加入这些临时表。
您还可以从两个 SP 复制代码并将它们组合以生成所需的结果集 - 可能会导致一些逻辑重复和维护问题。
或者,正如您所说,您可以在客户端进行。如果两个 SP 分别返回的信息比您希望一起返回的信息多得多,那么开销并不可怕(如果您可以从客户端异步生成它们然后一起处理它们,实际上效率会相当高)
所以在任何情况下,您都必须进行一些至少意义不大的编码和测试。
因此,我强烈建议您考虑将两个原始 SP 更改为表值函数(如果可能,内联)。然后两个原始 SP 可以从 UDF 中提取,新 SP 可以加入两个 UDF,就像您连接表或视图一样。从代码复制的角度以及从重用和语义的角度来看,它是最简单的 SP 连接机制 - UDF 代码相对容易阅读、使用和重用 - 它们基本上像参数化视图一样工作。此外,优化器倾向于很好地处理内联 TVF。在某些复杂的 SP 情况下 TVF 根本无法工作,但对于大部分场景,它们非常强大且高效。一个非常成功的功能,可以在任何 SQL Server 系统架构中提供显着帮助。
【讨论】: