2014-07-22 119 views
0

我正在使用下面的代碼來創建一個報告(返回的對象列表被用作rdlc文件中的數據源)。在nHibernate中優化查詢

我在查詢TNA對象列表,其中每個對象都可以包含一個Training對象列表。每個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管理工作室等,看看性能。

第二,您可以使用SQL探查器之類的工具來檢查數據庫中發生了什麼。

第三,請確保您有DB

第四創建適當的鍵和索引,檢查你如何初始化SessionFactory的。你是否每次創建新的sessionfactory

第五,請參閱您可以使用nhibernate的緩存。

第六,檢查如何從報表中調用程序作爲數據源。尋找任何無限循環,重複數據源連連結合等

第七,如果不需要從第二表中的所有數據一次,而不是在預測,你可以使用延遲加載,並得到需要的基礎上的對象

+0

不幸的是,我已經完成了大部分這些步驟,並且我需要一次完成所有數據。問題似乎是返回的對象的數量 - 數千個 - 這似乎導致內存不足錯誤。 – Matt