1

次のようなオブジェクト構造があります: Boxhas many Itemhas many Ingredient。特定のメソッドを呼び出すと、タスクを実行するためにすべてのコレクションを埋める必要があります。この場合、コレクションを熱心にロードする方が良いと思いましたが、私のテストでは、コレクションを遅延してロードする方が最小限高速です。ABoxには約 200Itemがあり、次に約 400 がありIngredientます。

すべてのコレクションにデータを入力する必要がある場合、NHibernate (3.3) での熱心な読み込みが遅くなるのはなぜですか?

4

3 に答える 3

2

さまざまなフェッチ モードの動作を変更することで、パフォーマンスに影響を与える変数がいくつかあります。一度にすべてを結合フェッチする場合は、返される行数が nBoxes * nItemsPerBox * nIngredientsPerItem になることを考慮してください。

1つのアイテムに400の成分が含まれているということですか?その場合、1 * 200 * 400 = 80000 行になる単一のボックスの場合。この場合、ボックス情報は 80000 回繰り返され、各アイテムは 400 回繰り返されます。転送するデータ量が多い。

NHibernate で SQL ロギングを有効にした場合、実際に関係するクエリは何ですか?

于 2012-05-30T11:34:27.537 に答える
1

ボックスごとに items プロパティにアクセスし、次にアイテムごとに material プロパティにアクセスすることを実際に確信していますか?
そうしないと、遅延読み込みで同じ量のデータを取得できません。

于 2012-05-30T10:24:31.690 に答える
0

テーブルとサブテーブルからすべての行をロードする必要があるためです。残念ながら、Hibernate は常にこれを最も賢明な方法で行うとは限りません。カスタム クエリを使用して、データをより効率的に読み込むことができます。しかし、質問する必要があります。本当にこれらすべての行が必要ですか?

于 2012-05-30T10:19:17.087 に答える