Sql server 检索具有多个相关行的行的首选方法
我目前正在用C#手工编写一个DAL,其中包含SqlDataReader和存储过程。性能很重要,但它仍然应该是可维护的 假设有一张食谱表Sql server 检索具有多个相关行的行的首选方法,sql-server,stored-procedures,multiple-resultsets,Sql Server,Stored Procedures,Multiple Resultsets,我目前正在用C#手工编写一个DAL,其中包含SqlDataReader和存储过程。性能很重要,但它仍然应该是可维护的 假设有一张食谱表 (recipeID、作者、所需时间、yummyFactor等) 还有一张桌子 (recipeID、名称、金额、yummyContributionFactor等) 现在我想查询大约200份食谱及其配料。我认为有以下可能: 查询所有配方,然后查询每个配方的成分。 这当然会导致任何疑问 在一个大的关联列表中查询所有食谱及其配料。这将导致大量无用的通信量,因为每个配方
(recipeID、作者、所需时间、yummyFactor等)
还有一张桌子
(recipeID、名称、金额、yummyContributionFactor等)
现在我想查询大约200份食谱及其配料。我认为有以下可能:
- 查询所有配方,然后查询每个配方的成分。
这当然会导致任何疑问 - 在一个大的关联列表中查询所有食谱及其配料。这将导致大量无用的通信量,因为每个配方数据将被传输多次。
- 查询所有配方,然后通过将RecipeID列表传回数据库,一次查询所有配料。或者,一次发出两个查询并返回多个结果集。回到DAL,根据配方将配料与食谱联系起来
- 异国情调的方式:光标穿过所有配方,并返回每个配方的两个单独的配方和配料结果集。结果集有限制吗?
您认为哪一个具有最佳的性能/混乱比率?最佳性能/混乱比率为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个事件类型