NHibernate занимает много времени для запуска запроса

Это делается с помощью Fluent NHibernate

У меня есть поиск NHibernate, который извлекает данные из одной таблицы. Если я возьму сгенерированный sql и запустю его через анализатор запросов, для запуска потребуется ~18 мс.

Используя NHProfiler, я получаю длительность этого запроса ~1800 мс - в 100 раз больше, чем sql!

Query duration
 - Database only:1800ms
 - Total: 1806ms

Заполняемый объект содержит дочерний класс, но этот дочерний объект загружается из кэша 2-го уровня NHibernate.

Возвращаемые данные разбиты на страницы (50 на запрос), хотя, насколько я могу судить, это не должно иметь никакого значения

У меня также запущен подсчет, и опять же, это занимает ~4 мс в анализаторе запросов и ~1800 мс согласно NHProfiler.

Отображает ли NH Profiler время выполнения запроса или полное время получения, сопоставляет классы и строит граф объектов? И если это первое - почему это занимает намного больше времени, чем прямой запрос?

РЕДАКТИРОВАТЬ: Только что нашел этот пост Ayende о значении длительности запроса, приведенной в NH Profiler: http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx - так что это определенно запрос базы данных, который занимает много времени

2 ответа

Решение

Наконец-то удалось отследить проблему.

Первичный ключ для объекта - это varchar в базе данных. NHibernate преобразовывал значение в nvarchar, когда выполнял запрос. К сожалению, это не было очевидно, если посмотреть на сгенерированный sql в NH Profiler. Замедление было вызвано SQL преобразованием nvarchar обратно в varchar

Я указал отображение для использования пользовательского типа

map.Id(x => x.Id).CustomType("AnsiString");

и проблема решена

Приветствую всех, помогите людям:)

Как правило, эти проблемы разрешаются в сети между вами и вашей базой данных. QA обычно подключается напрямую к базе данных, и все, что ему нужно отправить, это необработанные данные туда, где они отформатированы. Ваше приложение, вероятно, преобразует ваш набор результатов в набор данных или аналогичную конструкцию. Чтобы доказать это, измените немного кода (не весь слой данных), чтобы использовать средство чтения данных SQL для чтения ваших данных. Просто прочитайте все записи, не пытаясь разобрать все столбцы и сохранить данные. Скорее всего, он будет работать так же быстро, как ваша сеть.

Другие вопросы по тегам