NHibernate를 처음 사용합니다. NHibernate 프로필러에서 내 쿼리를 테스트 할 때 Select N + 1 경고가 표시됩니다. 나는 나의 매핑이나 질의에 대해 내가 뭘 잘못하고 있는지 확신하지 못한다.NHibernate 선택 N + 1
기본적으로 헤더라는 표가 있는데 많은 세부 정보가 있습니다. 각각의 세부 사항에 대해 나는 Replay를 가지고있다. 즉
하나 Header-> 많은 상세 한 상세 -> 하나의 재생
검색어 :
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은 기본 객체에 대한 하나의 선택 쿼리이고 N은 컬렉션을 가져 오기위한 추가 선택입니다. 희망이 맞습니다 –
내 매핑이 올바른지 알고 싶습니다. –