2014-07-22 1 views
0

다음 코드를 사용하여 보고서를 만듭니다 (반환 된 개체 목록은 rdlc 파일의 데이터 소스로 사용됩니다).nHibernate에서 쿼리 최적화

각 트레이닝 개체 목록을 포함 할 수있는 TNA 개체 목록을 쿼리하고 있습니다. 각 Training 객체에는 Course 객체가 포함될 수 있습니다. 각 TNA 개체에는 Employee 개체가 들어 있습니다.

그러나 코드를 실행하는 데 시간이 오래 걸립니다.

또한 TNA 개체가 수백 개 이상인 경우 쿼리가 완료되기 전에 메모리 부족 오류가 발생합니다.

nHibernate에 대한 많은 경험이 없습니다.이 코드를 최적화 할 수 있습니까? 아니면 코드에 명백한 오류가 있습니까?

미리 감사드립니다.

DetachedCriteria dc = this.BuildPermissions(moduleUser, typeof(TNA)); 
    ICriteria criteria = dc.GetExecutableCriteria(this.Session); 
    criteria.Add(Restrictions.Eq("Id", id)); 

    criteria.CreateAlias("TrainingRecords", "TrainingRecords", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 

    criteria.Add(Restrictions.Not(Restrictions.Eq("TrainingRecords.TNAStatus", TNAStatus.Optional))); 

    ProjectionList projectionList = 
     Projections.ProjectionList() 
        .Add(Projections.Property("OrgUnit"), "OrgUnit") 
        .Add(Projections.Property("Employee"), "Employee") 
        .Add(Projections.Property("TrainingRecords.Course"), "Course") 
        .Add(Projections.Property("TrainingRecords.RequiredBy"), "RequiredBy") 
        .Add(Projections.Property("TNATemplate"), "TNATemplate") 
        .Add(Projections.Property("TrainingRecords.TNAStatus"), "TNAStatus") 
        .Add(Projections.Property("Customer"), "Customer"); 


    ICriteria result = criteria.SetProjection(projectionList) 
           .SetResultTransformer(Transformers.AliasToBean<TrainingMatrix>()); 

    return result.List<TrainingMatrix>(); 

답변

0

먼저 nhibernate 구성에서 .ShowSql을 추가하고 nhibernate에서 생성 한 SQL 문을 검사하십시오. SQL Managment Studio 등에 넣고 성능을 확인할 수 있습니다.

두 번째로, SQL 프로파일 러와 같은 도구를 사용하여 데이터베이스에서 어떤 일이 일어나는지 확인할 수 있습니다.

셋째, 당신은 당신의 SessionFactory를 초기화하는 방법을 확인 당신이

넷째 DB

에서 만든 적절한 키와 인덱스가 확인하시기 바랍니다. 당신은 매번 새로운 sessionfactory을 만들고 있습니까?

다섯째, nhibernate의 캐싱을 사용할 수 있습니다.

여섯 번째로 보고서에서 데이터 소스로 프로그램을 호출하는 방법을 살펴보십시오. 어떤 무한 루프를 찾아, 데이터 소스는 반복적으로 또 다시 바인딩 등

일곱째, 대신 당신이 게으른 로딩을 사용하고 필요를 기준으로 개체를 얻을 수있는 예상을 한 번에 두 번째 테이블의 모든 데이터가 필요하지 않은 경우

+0

불행히도, 나는 이러한 단계의 대부분을 겪어 왔으며 모든 데이터를 즉시 필요로합니다. 문제는 반환 된 개체의 수 (수천 개)가 메모리 부족 오류를 일으키는 것으로 보입니다. – Matt