2010-02-16 1 views
4

Это делается с помощью Fluent NHibernateNHibernate занимает много времени для выполнения запроса

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

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

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

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

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

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

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

EDIT: Только что нашел этот пост Ayende о значении Длительности запроса приведен в NH Profiler: http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx - так это, безусловно, запрос из базы данных, которая занимает много времени

+0

Сколько времени занимает ADO.NET? –

+0

Каково основное узкое место, когда вы просматриваете код с помощью профайлера, подобного муравьям или dottrace? – Paco

+0

Использование ADO.NET занимает часть времени, которое делает NHibernate. На данный момент у меня нет никакого программного обеспечения для профилирования, поэтому я просто собираюсь разобраться и посмотреть, что он говорит. –

ответ

8

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

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

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

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

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

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

+0

Это очень помогло мне сегодня. –

+0

Я столкнулся с той же проблемой, это было большой помощью. –

1

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

+0

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

+0

, это моя точка ... теперь попробуйте прочитать ваши данные и извлечь каждый столбец в свой «контейнер строк» ​​независимо от того, что есть. Вероятно, вы увидите замедление. –

+0

Я только что запустил это, чтобы проверить и создать соединение, выполнив запрос (я делаю это против простого подсчета, чтобы сделать его максимально простым), а чтение данных занимает чуть больше миллисекунды. –