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