我正在使用nhibernate探查器并看到一些地方给我一个“选择n + 1”警告。
显而易见的解决方法是进行一些前期的热切联接,但它让我想到,如果在某些情况下使用Select N + 1实际上更简单或更快,与进行可能会加载大量您从未实际使用过的数据的连接相比
答案 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%的查询。