gpt4 book ai didi

sql-server - 哪个更好-向现有 SP 添加可选参数或添加新 SP?

转载 作者:太空狗 更新时间:2023-10-30 01:47:23 32 4
gpt4 key购买 nike

我有一个包含许多存储过程的生产 SQL-Server 数据库(报告)。SP以不同的方式向外界公开
- 一些用户可以直接访问 SP,
- 一些通过 WebService 公开
- 而其他的则通过 DCOM 层封装为接口(interface)。

用户群很大,我们不确切知道哪个用户集使用哪种访问数据库的方法。
我们经常(大约每隔一个月 1 次)来自用户集的请求,要求通过向输出添加一列或向现有输出添加一组列来修改现有 SP,所有其他内容保持不变。
我们最初通过修改现有 SP 并将新请求的列添加到输出的末尾来开始这样做。但这破坏了其他一些用户群构建的自定义工具,因为他们的工具对列数进行了硬编码,因此添加列意味着他们也必须修改他们的工具。

此外,对于某些列,需要复杂的逻辑才能将该列添加到报告中,这意味着 SP 性能下降,影响所有用户 - 甚至是那些不需要新列的用户。

我们正在考虑各种方法来解决此问题:

1 控制流程的默认参数

通过添加标志作为默认参数来控制代码路径,从而更新现有 SP 并控制新功能。通过使用默认参数,如果参数的值设置为 true 则仅调用新功能。默认情况下,它设置为 False。

Advantage

  • 不需要新对象。
  • 正在进行的维护不受影响。
  • 测试开销仍在控制之中。

Disadvantage

  • 由于修改了现有 SP,因此需要测试现有功能和新功能。
  • 由于我们不知道客户端工具如何调用 SP,因此我们永远无法确定我们没有破坏任何东西。
  • 如果同一报告因更多请求而再次被修改,将很难处理——这意味着更多的标志和代码将变得不可读。

2 新建存储过程

将为任何更改 SP 签名(输入/输出)的要求创建一个新的存储过程。
新的SP会为已有的东西调用原来的存储过程,并在上面添加新需求的逻辑。

Advantage

  • 这样做的好处是不会对现有程序产生影响,因此不需要对旧逻辑进行测试。

Disadvantage

  • 需要在请求更改时在数据库中创建新对象。这将是数据库维护的开销。

执行计划会根据添加新参数而改变吗?如果是,那么这可能会对未请求新列的用户产生不利影响。
考虑到 SP 是数据库的公共(public)接口(interface),接口(interface)应该是不可变的,我们应该选择选项 2 吗?
最佳做法是什么,还是视具体情况而定,选择选项时的主要驱动因素是什么?

提前致谢!

最佳答案

引用你的第一个选择的劣势:

It will be difficult to handle if same report gets modified again with more requests – will mean more flags and code will become un-readable.

我个人认为这是不修改现有存储过程以适应新列的最大原因。

当有多个分支的存储过程出现错误时,调试起来会变得非常困难。同样正如您所暗示的,执行计划可以随着分支/if 语句而改变。 ( sql using different execution plans when running a query and when running that query inside a stored procedure? )

这与面向对象的编码非常相似,您的直觉是正确的,即最好扩展现有对象而不是修改它们。

我会选择方法 2。您将拥有更多对象,但至少当出现问题时,您将能够知道受影响的存储过程的范围/影响有限。

随着时间的推移,我学会了水平增长对象/数据结构,而不是垂直增长。换句话说,只做一些新的东西,不要让现有的东西越来越大。

关于sql-server - 哪个更好-向现有 SP 添加可选参数或添加新 SP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18525208/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com