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

时间:2010-02-07 17:44:48

标签: sql-server stored-procedures multiple-resultsets

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

假设有一个表格食谱

(recipeID, author, timeNeeded, yummyFactor, ...)

和表成分

(recipeID, name, amount, yummyContributionFactor, ...)

现在我想用他们的成分查询200个食谱。我看到了以下几种可能性:

  • 查询所有食谱,然后查询每个食谱的成分 这当然会导致maaany查询。
  • 在大型联合列表中查询所有食谱其成分。这将导致大量无用的流量,因为每个配方数据将被多次传输。
  • 查询所有配方,然后通过将recipeID列表传递回数据库,立即查询所有配料。或者在一个处发出两个查询并返回多个结果集。回到DAL,通过他们的recipeID将成分与食谱相关联。
  • 异国情调的方式:游标尽管所有食谱,并为每个食谱返回两个单独的食谱和成分的结果集。结果集是否有限制?

对于更多种类,可以通过DAL中的ID列表或某些参数化的SQL条件来选择配方。

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

5 个答案:

答案 0 :(得分:2)

最佳表现/混乱比例是42。

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

答案 1 :(得分:2)

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

如果你有很多连接层,每个连接点的基数都在减少,那么这个故事会有所不同。例如,在我的一个应用程序中,我有以下内容:

Event -> EventType -> EventCategory
                   -> EventPriority
                   -> EventSource   -> EventSourceType -> Vendor

这样的查询导致重要重复数量,当有100k个要检索的事件,1000个事件类型,可能是10个类别/优先级,50个源和5个供应商时,这是不可接受的。所以在这种情况下,我有一个返回多个结果集的存储过程:

  • 所有带有EventTypeID的100k事件
  • 适用于这些事件的具有CategoryID,PriorityID等的1000个EventType
  • 适用于上述EventTypes的10个EventCategories和EventPriorities
  • 生成100k事件的50个EventSource
  • 等等,你明白了。

因为基数如此急剧下降,所以只需下载此处所需的内容并在客户端使用一些词典将其拼凑在一起(如果这是必要的话)要快得多。在某些情况下,低基数数据甚至可以缓存在内存中,并且根本不会从数据库中检索(除了应用程序启动或数据更改时)。

使用这种方法的决定性因素是非常多的结果基数的急剧下降,换句话说扇动。这实际上与大多数用法相反,可能与您在此处所做的相反。如果你选择“食谱”并加入“成分”,你可能散开,这可能会使这种方法浪费,特别是如果只有两个表可以加入。

所以我只是把它放在那里,这是一个可能的选择如果性能成为一个问题;在您的设计的这一点上,在您拥有真实世界的性能数据之前,我会简单地使用单个连接结果集。

答案 2 :(得分:0)

一个返回2个数据集的存储过程:“recipe header”和“recipe details”?

如果我一次性需要所有数据,这就是我要做的。如果我不需要一次性使用它,我仍然会得到2个数据集,但数据量较少。

我们发现在客户端使用它比稍微容易一些,而不是Andomar建议的一个大问题,但他/她的答案仍然非常有效。

答案 3 :(得分:0)

我会看一下更大的图片 - 你真的需要检索200种配方的配料吗?当你有2000时会发生什么?

例如,如果这是在网页中我将列出200个食谱(如果因为分页而不是更少),并且当用户点击其中一个以查看成分时,我将从数据库中获取成分。

如果这不可行,我将有一个存储过程返回一个包含2个表的DataSet。一个是配方,第二个是配料清单。

答案 4 :(得分:0)

  

“我目前正在用C#手写DAL ...”作为旁注,您可能想查看帖子:Generate Data Access Layer Methods From Stored Procs.它可以为您节省大量时间。