NHibernate занимает много времени для запуска запроса - PullRequest
4 голосов
/ 16 февраля 2010

Это делается с помощью 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 ]

8 голосов
/ 17 февраля 2010

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

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

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

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

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

Приветствую всех людей помощи:)

1 голос
/ 16 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...