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

本文关键字:计算 最佳 代码 映射 nhibernate | 更新日期: 2023-09-27 18:29:04

我正在使用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中的最佳值?我应该简单地输入一个高数字吗。把数字写得太高有坏处吗?

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

这个问题没有一个答案。

确定什么最有效的方法是在生产中评测应用程序,让真实的用户做真实的事情。这很耗时,所以只有当你发现应用程序很慢时,你才会这么做

数字过高的风险在于,一个有很多参数的查询为每个查询检索一系列记录,在DB上可能比几个较小的查询更难。

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

我的建议是,从20或50(*)开始,只有当你经常发现自己需要同时加载两倍以上的集合时,才将其调高。

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

虽然相当古老,但Ayende有一篇博客文章,他在其中比较了不同的批量大小(相信10、25、250)。看看吧。它可能对你有用。

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

如果我的页面大小是25,那么我的批量大小也是。我没有证据表明这是一个很好的选择价值,但如果感觉对我来说是正确的。

然而,他说,唯一真正的方法是遵循@Diego所写的内容,在实时服务器上运行一个探查器一周,并分析结果。更改批量大小,再运行一周,分析两个结果。我怀疑还有很多工作要做!

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