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");
}
このクエリのためのいくつかの応答を感謝しています。
ありがとうございました
"SELECT N + 1"の意味を理解していますか? –
少しです。何らかのオブジェクトのコレクションがあり、各オブジェクトが別のオブジェクト、すなわち1対多関係のコレクションを持っているとします。 SELECT N + 1はメインオブジェクトの選択クエリの1つで、コレクションを取得するためのN個の追加選択です。これが正しいことを願って –
私のマッピングが正しいかどうかを知りたい –