2011-09-30 5 views
0

우리는 고객을위한 새로운 시스템을 개발하고 있으며 우리는 약 23600 명의 구성원으로 구성된 구성원 테이블을 가지고 있습니다. 그리고 우리가 그들 모두를 얻으려고 할 때 시간이 지납니다. SQL 프로파일 러를 사용하여 질문을 받고 그것을 분리하여 실행하고 약 3 초가 걸렸습니다.nHibernate 큰 쿼리 시간 초과

using (ISession s = SessionFactory.OpenSession()) 
{ 
    return CreateCriteria(typeof(Member)).List<Member>();      
} 

23600 개체의 결과 매핑이 너무 오래 걸린 것처럼 보입니다. 예제를 300으로 제한하면 (.SetMaxResults (300)) 결과가 제대로 작동합니다. 최종 시스템에서 실제로 모든 구성원을 얻으려면 지금 당장 알지 못하지만, 대부분의 구성원이 우리 사이트의 멤버 자격 공급자에서 자신의 계정을 생성하도록 할 때가 언제인지 알고 있습니다.

회원 매핑 (유창 nHibernate 수) :

 Id(x => x.ID).Default("NEWID()"); 
     Map(x => x.LegacyID).ReadOnly(); 
     Map(x => x.Username).Length(32); 
     Map(x => x.Password).Length(32); 
     Map(x => x.MemberID).Length(10); 

     Map(x => x.FirstName).Length(50); 
     Map(x => x.LastName).Length(50); 
     Map(x => x.Gender).CustomType<int>(); 
     Map(x => x.BirthDate); 
     Component(c => c.Home); 
     Map(x => x.Email).Length(80); 
     Map(x => x.SendInformation).CustomType<int>(); 
     Map(x => x.SendInvoice).CustomType<int>(); 
     Map(x => x.Comment); 
     Map(x => x.PublicProfile); 
     Map(x => x.EntryDate); 
     Map(x => x.ResignationDate); 

     References<ProfileItem>(x => x.MemberStatus, "StatusID"); 
     References<ProfileItem>(x => x.MemberType, "TypeID"); 
     References<ProfileItem>(x => x.NationalAssociation); 
     References<ProfileItem>(x => x.Position, "PositionID"); 
     References<ProfileItem>(x => x.SpecialSkills, "SpecialSkillsID"); 
     References<ProfileItem>(x => x.CompanyType, "CompanyTypeID"); 
     References<ProfileItem>(x => x.JobType, "JobTypeID"); 
     References<ProfileItem>(x => x.GraduateCity, "GraduateCityID"); 
     HasManyToMany<ProfileItem>(x => x.Interessts).Table("MemberInterests") 
      .ParentKeyColumn("UserID").ChildKeyColumn("ProfileItemID").Cascade.AllDeleteOrphan().Not.LazyLoad(); 
     HasManyToMany<ProfileItem>(x => x.Properties).Table("MemberProperties") 
      .ParentKeyColumn("UserID").ChildKeyColumn("ProfileItemID").Cascade.AllDeleteOrphan().Not.LazyLoad(); 

     Component(c => c.Company).ColumnPrefix("Work"); 
     Component(c => c.Invoice).ColumnPrefix("Invoice"); 

     Map(x => x.Created); 
     Map(x => x.CreatedBy).Length(32); 
     Map(x => x.LatestChange); 
     Map(x => x.LatestChangeBy).Length(32); 

     Map(x => x.ElementarySchool); 
     Map(x => x.University); 
     Map(x => x.GraduateYear); 

     Map(x => x.Title).Length(50); 

     Map(x => x.LibraryAccess); 

누구든지이 문제 나 해결 방법을하는 방법에 대해 아무것도 알지?

+0

시간 증가가 선형입니까 (최대 값은 100, 200, 300)? 제한된 컬렉션의 IMO는 항상 일괄 처리 (페이지 매김)해야합니다. – Firo

+0

다른 멤버를 가져 와서 이러한 멤버를 가져 와서 무국적 세션 사용을 고려하고 싶다면 – Rippo

답변

1

너무 큰 데이터 세트를 가져 오는 것은 좋은 생각이 아닙니다. 메모리 소비에 대해 생각해보십시오. 이 데이터를 처리해야 할 경우 일괄 처리 (최대 1000 개 항목)의 처리를 고려하십시오. 사용자에게 현재 데이터가 필요한 경우 페이징을 고려하십시오. 가져온 데이터 집합을 줄일 수없는 경우 제한 시간을 늘릴 수는 있지만 권장되지는 않습니다.