2012-04-26 174 views
4

我想问你们如何在映射中一般使用batch-size。你通常在任何映射集合上设置一个特定的数字吗?当然,我确实知道其他获取策略,如join fetch,但有时我必须在后期处理过程中进行过滤,这可能会引发很多延迟加载。我想通过设置批量大小到100,在这种情况下我有更好的表现。NHibernate和批量大小

您是否在任何映射集合上设置了此属性?如果没有,为什么不呢?会有什么缺点吗?

THX对于任何输入 sl3dg3

回答

4

上收集或父实体设置batch-size打算几乎做同样的事情。

batch-size究竟是在做什么,取出SELECT N+1问题并将其转化为SELECT N/batch-size + 1条件。

有一个缺点,那就是你需要平衡设置正确数字的区别。如果批量过大,则会加载太多数据,如果过小,则仍会有太多查询。你如何平衡这一点是开放的辩论,没有设置测试是不可能衡量的。

我认为这是一个微型优化,因为它可以真正减少select/n + 1问题。然而,它并不像独立地为每个场景选择正确的获取策略一样重要,这使得总体上更好的策略。

我也认为这是一个生产问题,应该根据真实数据对真实用户进行测试。

作为一个便笺,我总是设置我的batch-size等于我的分页大小,不要问我为什么它只是感觉不错!

+0

如何加载太多的数据?无论如何,它需要被加载。就我的批量大小而言,它只将许多不同的查询分组并将其一次发送到数据库。 – sl3dg3 2012-04-26 11:42:02

+0

也许/可能不是,如果您没有使用您引用的所有集合,例如您检索1000条评论,但只显示前25条评论,您将不必要地加载数据。对于数据库而言,有很多参数的查询“可能”会比一些较小的查询更难。这就是为什么我建议设置测试 – Rippo 2012-04-26 12:15:36

+0

啊 - 我想如果我定义lazy =“true”,如果数据在代码中没有被访问,批量大小不会触发任何东西?我不希望Hinbernate在不必要的情况下加载任何东西... – sl3dg3 2012-04-26 12:28:34