8

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

4

3 回答 3

6

这个问题没有单一的答案。

确定什么最有效的唯一方法是在生产环境中分析应用程序,让真实的用户在做真实的事情。这很耗时,因此可能只有当您发现应用程序运行缓慢时才会这样做

数字过高的风险在于,具有大量参数的查询为每个查询检索一系列记录在数据库上可能比一些较小的查询更难。

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

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

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

于 2012-03-24T15:42:06.313 回答
3

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

于 2012-03-24T16:07:56.877 回答
1

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

因此,如果我的页面大小是 25,那么我的批量大小也是如此。我没有证据表明这是一个很好的选择,但如果我觉得合适的话。

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

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

于 2012-03-25T06:37:37.717 回答