1

NHibernateの新機能です。 NHibernate ProfilerからクエリをテストするときにSelect N + 1警告が表示されます。マッピングやクエリで何が間違っているのか分かりません。NHibernateの選択N + 1

基本的に私はヘッダーと呼ばれるテーブルを持っており、多くの詳細を持っています。各ディテールにはリプレイがあります。すなわち

1 Header->多くの詳細 1つの詳細 - > 1つのリプレイ

問合せ:

var query = _session.QueryOver(() => headerAlias) 
        .Where(() => headerAlias.ScriptNumber == scriptId) 
        .And(() => headerAlias.ChannelCode == channelId) 
        .Future<ProgramHeader>(); 

マイマップ:

public ProgramHeaderMap() 
{ 
    Table("S_IDB_M_PROG_HDR"); 

    CompositeId() 
     .KeyProperty(x => x.ScriptNumber, "PROGCD") 
     .KeyProperty(x => x.ChannelCode, "CHCD"); 

    Map(x => x.ChannelCode).Column("CHCD"); 
    Map(x => x.ShowCode).Column("SHOWCD"); 
    Map(x => x.ShowStartTime).Column("ONAIRSTART"); 
    Map(x => x.ShowEndTime).Column("ONAIREND"); 
    Map(x => x.Presenters).Column("HOST"); 
    Map(x => x.Guests).Column("GUEST"); 
    Map(x => x.Planners).Column("PLANNER"); 
    Map(x => x.ModifiedTime).Column("UPDDATE"); 

    HasMany(x => x.Pal) 
      .AsBag() 
      .Inverse() 
      .KeyColumns.Add("PROGCD", "CHCD") 
      .Cascade.All() 
      .Not.LazyLoad(); 
} 

DetailMap:

public ProgramDetailMap() 
{ 
    Table("S_IDB_M_PROG_DTL"); 

    CompositeId() 
     .KeyProperty(x => x.ScriptNumber, "PROGCD") 
     .KeyProperty(x => x.ChannelCode, "CHCD") 
     .KeyProperty(x => x.ProductNumber, "PRODCD") 
     .KeyProperty(x => x.ColorCode, "COLORCD") 
     .KeyProperty(x => x.SizeCode, "SIZECD"); 

    Map(x => x.PromoCode,"PCPARAM1"); 
    Map(x => x.EasyPayInstalments,"EZINST"); 
    Map(x => x.EasyPayFirstAmount,"EZAMT"); 
    Map(x => x.EasyPayNextAmount,"EZAMT2"); 
    Map(x => x.UpdatedDate).Column("UPDDATE"); 

    References(x => x.ProgramHeader) 
     .Columns("PROGCD", "CHCD") 
     .LazyLoad(); 

    References(x => x.Replay) 
     .Columns("PROGCD", "CHCD", "PRODCD", "COLORCD", "SIZECD") 
     .NotFound.Ignore(); 
} 

}

リプレイ:

public ProgramReplayMap() 
{ 
    Table("S_IDB_M_PROG_REPL"); 

    CompositeId() 
     .KeyProperty(x => x.ScriptNumber, "PROGCD") 
     .KeyProperty(x => x.ChannelCode, "CHCD") 
     .KeyProperty(x => x.ProductNumber, "PRODCD") 
     .KeyProperty(x => x.ColorCode, "COLORCD") 
     .KeyProperty(x => x.SizeCode, "SIZECD"); 

    Map(x => x.Price, "REC_PRICE"); 
    Map(x => x.Postage, "REC_POSTAGE"); 
    Map(x => x.UpdatedDate).Column("UPDDATE"); 
} 

このクエリのためのいくつかの応答を感謝しています。

ありがとうございました

+0

"SELECT N + 1"の意味を理解していますか? –

+0

少しです。何らかのオブジェクトのコレクションがあり、各オブジェクトが別のオブジェクト、すなわち1対多関係のコレクションを持っているとします。 SELECT N + 1はメインオブジェクトの選択クエリの1つで、コレクションを取得するためのN個の追加選択です。これが正しいことを願って –

+0

私のマッピングが正しいかどうかを知りたい –

答えて

0

バッチフェッチを有効にすることをお勧めします。ドキュメントはhttp://nhibernate.info/doc/nhibernate-reference/performance.html#performance-fetching-batch

です。FluentNHibernateでは、ClassMapとコレクションマッピングの.BatchSize()メソッドとして利用できます。

バッチフェッチとは、NHibernateが同じタイプの複数の関連インスタンスを一度にフェッチすることを意味します。たとえば、Bインスタンスのうちの1つにアクセスするとすぐに、それぞれBインスタンスへの遅延参照を保持する20のインスタンスをロードした場合、NHibernateは1つのクエリを使用して20個のBインスタンスすべてをロードできます。あなたが参照されているBインスタンスの1つにアクセスすると、他のインスタンスにもすぐにアクセスし、同じクエリを使用して20のインスタンスを読み込むことは非常に高速であるため、ロードすると大したことはない実際には必要ないものはいくつかあります。 (番号20は、バッチサイズの設定を使用して制御するものです)