Оптимизация запросов в nHibernate

Я использую следующий код для создания отчета (список возвращаемых объектов используется как источник данных в файле rdlc).

Я запрашиваю список объектов TNA, каждый из которых может содержать список объектов обучения. Каждый объект обучения может содержать объект курса. Каждый объект 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>();
</trainingmatrix></trainingmatrix>
1 ответ

Во-первых, добавьте.ShowSql в конфигурацию nhibernate и рассмотрите инструкцию sql, создаваемую nhibernate. Вы можете поместить его в SQL Managment Studio и т.д. И увидеть производительность.

во-вторых, вы можете использовать такие инструменты, как профилировщик SQL, для изучения того, что происходит в базе данных.

в-третьих, убедитесь, что у вас есть соответствующие ключи и индексы, созданные в БД

В-четвертых, проверьте, как вы инициализируете свой сеанс. Вы каждый раз создаете новую сессию?

пятое. Смотрите, вы можете использовать кеширование nhibernate.

в-шестых, рассмотрите, как вы вызываете программу из отчета в качестве источника данных. искать любые бесконечные циклы, источник данных, повторно связывающий снова и снова и т.д.

седьмой, если не нужны все данные из второй таблицы одновременно, вместо этого на проекциях вы можете использовать ленивую загрузку и получать объекты на основе потребности

licensed under cc by-sa 3.0 with attribution.