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

この質問に対する答えは 1 つではありません。

何が最適かを判断する唯一の方法は、実際のユーザーが実際のことを行って、本番環境でアプリをプロファイリングすることです。これには時間がかかるため、アプリが遅いとわかった場合にのみ実行することになるでしょう。

数値が大きすぎると、多数のパラメーターを使用して各レコードの範囲を取得するクエリが、いくつかの小さなクエリよりも DB で困難になる可能性があるというリスクがあります。

また、参照したすべてのコレクションを使用していない場合 (たとえば、PostCategories のリストを取得したが、そのうちの 1 つの投稿のみを表示した場合)、大量のデータを不必要にロードしている可能性があります。

私のアドバイスは、20 または 50(*) のようなものから始めて、同時にロードされるコレクションの数がその 2 倍以上必要になることが多い場合にのみ、それを高くすることです。

(*): はい、私はそれらの数字をお尻から引き出しました。50 は、私が現在デフォルトで使用しているものです。

于 2012-03-24T15:42:06.313 に答える
3

かなり古いですが、 Ayendeによるブログエントリがあり、そこで彼はさまざまなバッチサイズを比較しています(10、25、250を信じています)。見てみな。それはあなたに役立つかもしれません。

于 2012-03-24T16:07:56.877 に答える
1

通常batch-size、GUI のページ サイズと同じ値に設定します。

したがって、ページ サイズが 25 の場合、バッチ サイズも 25 です。これが選択するのに良い値であるという証拠はありませんが、私にとって正しいと感じた場合.

ただし、唯一の正しい方法は、@Diego の記述に従って、ライブ サーバーでプロファイラーを 1 週間実行し、結果を分析することです。バッチサイズの実行を別の週に変更して、両方の結果を分析します。私が疑う多くの仕事!

これは悪影響を与える可能性があるため、高い値はお勧めしません。これを調べるもう 1 つの方法は、バッチサイズが大きい場合、そもそも select ステートメントで多くのレコードに戻っている可能性があるということです。

于 2012-03-25T06:37:37.717 に答える