选择N + 1是否比渴望加入更好?

时间:2011-01-03 05:17:42

标签: sql-server nhibernate

我正在使用nhibernate探查器并看到一些地方给我一个“选择n + 1”警告。

显而易见的解决方法是进行一些前期的热切联接,但它让我想到,如果在某些情况下使用Select N + 1实际上更简单或更快,与进行可能会加载大量您从未实际使用过的数据的连接相比

3 个答案:

答案 0 :(得分:2)

你的想法是正确的。例如,在某些情况下,所有根实体都引用另一个实体的一个或两个实例。做2或3个小选择而不是非规范化选择(即加入连接)可能会更快

有几种方法可以在几乎所有情况下都方便:batch-size。如果您将实体和集合中的此属性设置为通常的页面大小,您将获得一定数量的小选择(每个实体类型一个)。

答案 1 :(得分:1)

一旦您的应用程序中有足够的数据,选择N + 1将成为越来越大的问题。

通常,加载数据比另一次访问数据库要便宜得多。所以如果你能 - 你显然应该避免它。

至于加载其他数据。如果你认为你将加载不会被使用的属性值,你可以使用NHibernate 3.0延迟加载属性功能。

因此应该避免整体选择N + 1.

答案 2 :(得分:1)

我不确定您是否了解其他选项

在你的映射中添加

<list name="MyItems" batch-size="10">

<bag name="MyItems" batch-size="10">

如果您有10个项目,则只需要两个查询而不是11个。对于20个项目,您需要 三而不是21等。这将减少大约90%的查询。