【问题标题】:Stored procedure to return multiple sets VS multiple stored procedures for each set返回多个集合的存储过程 VS 每个集合的多个存储过程
【发布时间】:2015-05-29 15:27:41
【问题描述】:

我有一个连接到多个其他表的表。

Quote
QuoteBuyingRate
QuoteChargesDetail
QuoteDisclaimer

我可以

  1. 使用多个存储过程从所有 4 个中选择我需要的数据
  2. 在一个存储过程中使用多个 select 语句选择数据

除了设计偏好或意见之外,使用其中一个或另一个是否有任何真正的技术优点/缺点?性能问题?

【问题讨论】:

  • 据我所知没有重大的性能问题。
  • 我个人喜欢选项 b,但不是 4 个单独的 select 语句,主过程将调用 4 个子过程。每次您需要填充实体/对象时,此选项仅创建一个连接和一个数据库调用。所以我会有一个名为 usp_Quote_Load_All 的存储过程,它调用 4 个其他过程,usp_quote_select、usp_quotebuyingrate_select 等。
  • @benjaminmoskovits 确保存储过程可以返回多个结果集。这很简单,只需在您的程序中包含 1 个以上的 select 语句。
  • @benjaminmoskovits 它完全按照您的想法编写,只需将多个 select 语句放入存储过程中。通过 google 搜索也很容易找到。去看看。祝你好运。
  • @benjaminmoskovits 澄清一下如何处理多个结果集:MARS 是它们的一个非常特殊的应用程序,它允许在检索结果时执行其他命令。这与简单地循环使用多个结果集不同。与 MARS 无关,使用SqlDataReader.NextResult() 或填充DataSet 在.NET 中访问其他结果集相当容易,然后每个结果集将包含一个表。但是,正如您刚才提到的,在纯 T-SQL 中处理多个结果集绝非易事。

标签: c# sql asp.net sql-server vb.net


【解决方案1】:

从绝对表面上看,没有什么理由选择一种方式。假设每分钟没有多次拨打电话,那么多次电话和一次电话之间的区别是无关紧要的。除非呼叫次数很高,否则绝对没关系。

因此,如果您想出一个理由,无论哪种方式对您的用例来说都是更好的架构,那就去吧。如果你没有任何东西在推动你,为了简单起见,只需在一个存储过程中执行它,并且网络传输效率略高。

现在,如果您开始有条件逻辑或其他复杂性以便在一次调用中将它们全部包含在内,那么您将导致潜在的查询计划缓存问题,并可能影响您的可伸缩性。

【讨论】:

  • 您谈到了我所问的一些问题,即“假设一分钟内没有多次拨打电话,那么多次电话和一次电话之间的区别是无关紧要的。” ...我一直在寻找有关此的一些文档,但找不到任何文档。您是否有任何参考资料,或者您只是从您的心理知识库中提取它?
  • 它来自大量的个人经验。衡量某事物的效率或效率如何的绝对最佳方法是衡量它。分析代码和 dB 呼叫将为您提供个人环境和呼叫音量/频率的硬数字。话虽如此,假设从 db 到应用程序服务器的连接良好,连接时间尤其是在使用连接池(如 . net 默认情况下,是执行总成本的一个非常小的组成部分。
【解决方案2】:

这些表是如何连接的?如果您的表具有主键并通过外键约束连接,那么您可能不需要运行多个存储过程或从单个存储过程返回多个结果集。如果您可以利用 JOIN,则返回单个结果集的单个存储过程可能就足够了。

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2014-01-04
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2010-11-28
    相关资源
    最近更新 更多