使用nhibernate时,如何在映射代码中找出最佳批量大小?

时间:2012-03-24 14:07:10

标签: c# nhibernate fluent-nhibernate updatebatchsize

我正在使用nhibernate,我在映射区域中有这样的代码:

  HasMany(x => x.People).AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(80); 
  HasMany(x => x.Clothes).AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(150);

我的问题是,我如何找出最佳价值.BatchSize?我应该简单地说一个很高的数字。将数字设得太高会有不利因素吗?

3 个答案:

答案 0 :(得分:6)

这个问题没有一个答案。

确定哪种方法最有效的唯一方法是分析应用在生产中,真实用户在做实事。这很费时间,所以只有当你发现应用程序很慢时才会这样做

数字太高的风险是,具有大量参数的查询检索每个参数的记录范围可能在数据库上比一些较小的查询更难。

此外,如果您使用您引用的所有集合(例如,如果您检索了PostCategories列表,但您只显示其中一个的帖子),那么您可能不必要地加载大量数据。

我的建议是从20或50(*)之类的东西开始,只有当你经常发现自己需要同时加载的集合数量的两倍以上时,才能使它更高。

(*):是的,我确实从我的屁股上取下了这些数字。 50是我目前默认使用的。

答案 1 :(得分:2)

虽然相当陈旧,但Ayende有一个blog entry,在那里他比较了不同的批量大小(相信10,25,250)。看看这个。它可能对你有用。

答案 2 :(得分:1)

我通常将batch-size设置为与GUI页面大小相同的值。

因此,如果我的页面大小为25,那么我的批量大小。我没有证据表明这是一个很好的选择,但如果只是感觉对我来说。

然而,唯一真实的方法是遵循@Diego编写的内容,在实时服务器上运行一个探查器一周并分析结果。将批量大小运行更改为另一周,分析两个结果。我怀疑很多工作!

我不建议高价值,因为这可能会产生负面影响。另一种看待这种情况的方法是,如果您的批量大小很高,那么您可能首先会在select语句中返回许多记录。