Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 检索具有多个相关行的行的首选方法_Sql Server_Stored Procedures_Multiple Resultsets - Fatal编程技术网

Sql server 检索具有多个相关行的行的首选方法

Sql server 检索具有多个相关行的行的首选方法,sql-server,stored-procedures,multiple-resultsets,Sql Server,Stored Procedures,Multiple Resultsets,我目前正在用C#手工编写一个DAL,其中包含SqlDataReader和存储过程。性能很重要,但它仍然应该是可维护的 假设有一张食谱表 (recipeID、作者、所需时间、yummyFactor等) 还有一张桌子 (recipeID、名称、金额、yummyContributionFactor等) 现在我想查询大约200份食谱及其配料。我认为有以下可能: 查询所有配方,然后查询每个配方的成分。 这当然会导致任何疑问 在一个大的关联列表中查询所有食谱及其配料。这将导致大量无用的通信量,因为每个配方

我目前正在用C#手工编写一个DAL,其中包含SqlDataReader和存储过程。性能很重要,但它仍然应该是可维护的

假设有一张食谱表

(recipeID、作者、所需时间、yummyFactor等)

还有一张桌子

(recipeID、名称、金额、yummyContributionFactor等)

现在我想查询大约200份食谱及其配料。我认为有以下可能:

  • 查询所有配方,然后查询每个配方的成分。
    这当然会导致任何疑问
  • 在一个大的关联列表中查询所有食谱及其配料。这将导致大量无用的通信量,因为每个配方数据将被传输多次。
  • 查询所有配方,然后通过将RecipeID列表传回数据库,一次查询所有配料。或者,一次发出两个查询并返回多个结果集。回到DAL,根据配方将配料与食谱联系起来
  • 异国情调的方式:光标穿过所有配方,并返回每个配方的两个单独的配方和配料结果集。结果集有限制吗?
对于更多种类,可以通过DAL中的ID列表或一些参数化SQL条件来选择配方


您认为哪一个具有最佳的性能/混乱比率?

最佳性能/混乱比率为42


更重要的是,使用最简单的解决方案:通过单个查询检索所有内容。在遇到性能问题之前不要进行优化。“过早优化是万恶之源”:

最佳性能/混乱率为42


更重要的是,使用最简单的解决方案:通过单个查询检索所有内容。在遇到性能问题之前不要进行优化。“过早优化是万恶之源”:

一个存储过程返回两个数据集:“配方头”和“配方详细信息”

如果我一次需要所有数据,我会这么做。如果我一次不需要它,我仍然会得到2个数据集,但数据更少


我们发现在客户端处理这个问题比Andomar建议的一个大查询要简单一些,但他/她的答案仍然非常有效。

一个存储过程返回两个数据集:“配方标题”和“配方详细信息”

如果我一次需要所有数据,我会这么做。如果我一次不需要它,我仍然会得到2个数据集,但数据更少


我们发现在客户端处理这个问题比Andomar建议的一个大查询要简单一些,但他/她的答案仍然非常有效。

如果只需要连接两个表,并且“成分”不是大量数据,那么性能和可维护性的最佳平衡可能是一个连接的查询。是的,您在结果中重复了一些数据,但是除非您有100000行,并且数据库服务器/网络过载,否则进行优化还为时过早

如果有很多层连接,每个连接的基数都在减少,那么情况就有点不同了。例如,在我的一个应用程序中,我有如下内容:

Event -> EventType -> EventCategory
                   -> EventPriority
                   -> EventSource   -> EventSourceType -> Vendor
这样的查询会导致大量重复,当有100k个事件要检索、1000个事件类型、可能有10个类别/优先级、50个源和5个供应商时,这是不可接受的。在这种情况下,我有一个存储过程,它返回多个结果集:

  • 仅具有EventTypeID的所有100k事件
  • 应用于这些事件的具有CategoryID、PriorityID等的1000个事件类型
  • 适用于上述事件类型的10个事件类别和事件优先级
  • 生成100k事件的50个EventSources
  • 诸如此类,你就明白了
由于基数下降得如此之快,因此只下载此处需要的内容并在客户端使用一些字典将其拼凑在一起(如果有必要的话)要快得多。在某些情况下,低基数数据甚至可能被缓存在内存中,根本不会从数据库中检索(应用程序启动时或数据更改时除外)

使用这种方法的决定因素是非常多的结果,以及联接的基数急剧减少,换句话说扇入。这实际上与大多数用法相反,也可能与您在这里所做的相反。如果您正在选择“食谱”并加入“配料”,则可能是散开了,这可能会造成浪费,尤其是在只有两个表可加入的情况下


所以我只是想说,如果性能成为一个问题,这是一个可能的替代方案;在设计的这一点上,在获得真实的性能数据之前,我只想使用一个连接的结果集。

如果您只需要连接两个表,并且“成分”不是大量数据,那么性能和可维护性的最佳平衡可能是一个连接的查询。是的,您在结果中重复了一些数据,但是除非您有100000行,并且数据库服务器/网络过载,否则进行优化还为时过早

如果有很多层连接,每个连接的基数都在减少,那么情况就有点不同了。例如,在我的一个应用程序中,我有如下内容:

Event -> EventType -> EventCategory
                   -> EventPriority
                   -> EventSource   -> EventSourceType -> Vendor
这样的查询会导致大量重复,当有100k个事件要检索、1000个事件类型、可能有10个类别/优先级、50个源和5个供应商时,这是不可接受的。在这种情况下,我有一个存储过程,它返回多个结果集:

  • 仅具有EventTypeID的所有100k事件
  • 具有CategoryID、PriorityID等的1000个事件类型