我有一个这样的对象结构:Box
has many Item
has many Ingredient
。当我调用某个方法时,必须填充所有集合才能执行任务。我认为在这种情况下急切地加载集合会更好,但在我的测试中,懒惰地加载它们的速度最小。ABox
大约有 200 Item
,而后者又大约有 400 Ingredient
。
当必须填充所有集合时,为什么使用 NHibernate (3.3) 急切加载会变慢?
我有一个这样的对象结构:Box
has many Item
has many Ingredient
。当我调用某个方法时,必须填充所有集合才能执行任务。我认为在这种情况下急切地加载集合会更好,但在我的测试中,懒惰地加载它们的速度最小。ABox
大约有 200 Item
,而后者又大约有 400 Ingredient
。
当必须填充所有集合时,为什么使用 NHibernate (3.3) 急切加载会变慢?
有几个变量可以通过改变不同获取模式的工作方式来影响性能。如果您要一次性获取所有内容,请考虑返回的行数将是 nBoxes * nItemsPerBox * nIngredientsPerItem。
你的意思是单品有400种成分?如果是这样,对于一个 1 * 200 * 400 = 80000 行的盒子。在这种情况下,框信息将重复 80000 次,每个项目将重复 400 次。大量数据要传输。
如果在 NHibernate 中打开 SQL 日志记录,实际涉及的查询是什么?
您是否真的确定,对于每个盒子,都会访问 items 属性,而对于每个项目,又会访问成分属性?
否则,您不会通过延迟加载检索相同数量的数据。
因为它必须从一个表和一个子表中加载所有行。不幸的是,Hibernate 并不总是以最聪明的方式做到这一点。您可以使用自定义查询来更有效地加载数据。但是你必须问一个问题,你真的想要所有这些行吗?