0

次のデータベース構造があり、レポートのために完全にトラバースする必要があります。

Product -> ProductVariation -> ProductMedaItem
Product -> CategoryLinks -> Category

テーブルにクエリがありProducts、上記のデータをまとめてアクセスするため、これらのデータをプリフェッチしたいと考えています。組み合わせが爆発してデータの負荷が発生するため、JOIN の使用は避けたいと思います。

私の目の理想的な解決策は次のとおりです。

  • 一致するすべての製品をロードするためのクエリが発行されます
  • Select * from ProductVariations where ProductId in ([all_product_id_set])次に、結果セットが解析され、' ;のようなクエリに基づいて、すべての製品バリエーションが一緒に読み込まれます。
  • 繰り返しますが、この結果セットは解析され、次ProductMediaItemのようなクエリを使用してすべてがフェッチされますSelect * from ProductMediaItem where ProductVariationId in ([all_product_variation_id_set]);
  • などなど

これにより、SELECT異なる関連付けごとに 1 つになります。したがって、すべての製品バリエーション、そのメディア アイテム、各製品カテゴリ リンク、およびそれぞれのカテゴリを読み込むには 5SELECT秒かかります。

を使用してみcriteria.SetFetchMode("ProductVariations", FetchMode.Select")ましたが、これは何もしません。私の現在の回避策はバッチ処理を使用することですが、これでもすべてのデータを取得するために約 50 ~ 60 のクエリが発生します。それほど遅くはありませんが、はるかに高速化できると思います。

NHibernate の最新バージョン - 3.3 を使用しています。

更新 1

通常の OOP を使用してコレクションをトラバースしたいと思います。例:

foreach (var p in Products)
{
    foreach (var variation in p.ProductVariations)
    {
        foreach (var mediaItem in variation.MediaItems)
        {
              ...
        }
    }
}
4

1 に答える 1

0

MultiQueries と MultiCriteria が機能するか、さらに簡単なのは先物です。たとえば、次のようになります。

var productVariations = session.CreateQuery(
        "Select * from ProductVariations where ProductId in ([all_product_id_set])")
        .Future<ProductVariations>();

var mediaItems = session.CreateQuery(
        "select pv.MediaItems from ProductVariations pv where pv.ProductId in ([all_product_id_set])")
        .Future<ProductMediaItem>();

など...それらのいずれかを列挙すると、すべてのクエリが一度に実行されます。唯一の「トリック」は、製品から選択したいさまざまなアイテムへの関係をたどることです

于 2012-06-01T12:36:50.033 に答える