Продолжительность запроса в NHibernate Profiler

У меня есть приложение ASP .Net MVC, которое использует Fluent NHibernate для доступа к базе данных оракула. Я также использую NHibernate Profiler для мониторинга запросов, генерируемых NHibernate. У меня есть один запрос, который действительно прост (выбор всех строк из таблицы с 4 строковыми столбцами). Используется для создания отчета в формате CSV. Моя проблема в том, что выполнение запроса занимает очень много времени, и я хотел бы получить немного больше информации о длительности, отображаемой nhprof. С 65 000 строк это занимает 10-20 секунд, хотя длительность "Только база данных" показывает только около 20 мс. Сетевая задержка не должна разглядеть большую часть этого времени, потому что серверы находятся в одной гигабитной локальной сети. Я не ожидаю, что люди смогут точно определить для меня, где находится узкое место, но я хотел бы узнать некоторые подробности о том, как читать измерения длительности в профилировщике NHibernate.

Что входит в часть "Только база данных", а что входит в "Общее время"? Включает ли общее время обработку, выполненную после заполнения объектов C#, так что это время фактически для всего http-запроса? Зная об этом, надеюсь, я смогу устранить некоторые факторы.

Вот как выглядит класс отображения NHibernate:

Table("V_TICKET_DETAILS");

CompositeId()
     .KeyProperty(x => x.TicketId, "TICKET_ID")
     .KeyProperty(x => x.Key, "COLUMN_NAME")
     .KeyProperty(x => x.Parent, "PARENT_NAME");

 Map(x => x.Value, "COLUMN_VALUE");

И запрос, сгенерированный nh profiler, выглядит так:

SELECT this_.TICKET_ID    as TICKET1_35_0_,
       this_.COLUMN_NAME  as COLUMN2_35_0_,
       this_.PARENT_NAME  as PARENT3_35_0_,
       this_.COLUMN_VALUE as COLUMN4_35_0_
FROM   V_TICKET_DETAILS this_

Представление действительно простое, только объединение двух таблиц по двузначному целому числу.

Я ни в коем случае не эксперт по базам данных, поэтому я был бы рад всем комментариям, которые укажут мне правильное направление.

2 ответа

Решение

Общее время - только для вызова запроса nHib.
Тем не менее, оно включает в себя, помимо времени в дБ, время, необходимое nHib для заполнения ваших сущностей (гидратация). и это, вероятно, ваш виновник.
У меня была похожая проблема, возможно, некоторые из предложений могут вам помочь.

Суть в том, что nHib не предназначен для загрузки больших наборов данных.
Если бы ни одно из полученных мной предложений не помогло вам, я бы предложил несколько вещей:
1. Вряд ли вашему пользователю нужно одновременно просматривать 65 000 строк данных. возможно, вы можете найти способ отфильтровать данные, чтобы результирующий набор был меньше (и более читабельным).
2. В противном случае, если, как вы говорите, "особый" случай, который возникает только при создании отчета, вам не нужно использовать nHib. Вы можете просто использовать, скажем, хорошие старые классы ADO.Net...

Существует также IStatelessSession который предназначен для таких ситуаций. Он не имеет кеша сессии и экономит много работы. Это должно быть намного быстрее.

using (var session = factory.OpenStatelessSession())
{
}
Другие вопросы по тегам