不是说执行3件事的单个存储过程的当前设置需要太长时间。但也许为了加速,当用户可以看到一些信息是有用的时候。
我有一个使用async/await
模式运行的存储过程,并返回3组不同的数据。他们都不需要任何其他2,所以订单和谁先完成是一个非问题。因此,在整个SP运行并返回之前,用户不会在网页上看到任何内容。
除了更多代码,这是不可取的,将SP分解为3个单独的SP并对这些SP进行3次单独的async
调用会更有意义吗?
从旁注来看,仍然只有一个SP,但有一个新的@Which
参数有意义吗?在@Which = 1
查询此数据时,@Which = 2
查询该数据时的含义等。或者是否会出现某种延迟尝试通过3次单独async
次呼叫多次运行相同的SP?
我做了一些研究 - Why should I prefer single 'await Task.WhenAll' over multiple awaits?是很好的信息,但不是我的问题。
答案 0 :(得分:2)
与往常一样,对此没有正确或错误的答案。但是,有一些特定的开发模式可以解决这个问题。
我不相信让存储过程返回多个结果集是一件坏事,但是你提到结果集是相互独立的。我对该陈述的理解是,SP正在执行3个不同的工作单元,并且可以,应该并且将具有不依赖于操作的另一部分的结果的结果集。我认为这会使单一责任原则失效。 https://en.wikipedia.org/wiki/Single_responsibility_principle
如果您不得不更新存储过程的一部分,则现在必须触摸整个存储过程,并可能更改与所请求更改无关的内容。
如果您只需要获取Stored过程结果的一部分,您仍然需要获取过程中的所有结果集,可能没有理由。
现在我可能会争辩说,如果所有3个结果集都依赖于相同的工作数据集,那么这将是一种可接受的方法。需要保证在所有结果集中类似的工作集。比如说一个详细的结果集和几个不同的聚合版本,或者具有某些特定连接条件的东西。理想情况下,还有其他方法可以解决其中一些问题。
从数据库可维护性的角度来看,我建议制作这3个单独的调用/存储过程。
答案 1 :(得分:1)
是的,假设三个SP不相互竞争,你应该能够将它们分成3个或在一个参数内部具有相同的存储过程分支,没有任何问题。您选择的这两个选项中的哪一个是个人偏好,但如果他们做了3个逻辑单独的事情,我会选择3个sprocs。