Запрос NHibernate SQL становится медленнее



Я создаю систему, которая должна обрабатывать все данные о товарах из базы данных (сейчас тестирую 200 000 товаров + данные распределены по нескольким таблицам).

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

Сейчас я борюсь с тем фактом, что выполнение некоторых запросов занимает до 5 минут, а в лучшем случае 2 секунды. (помните, что это один и тот же запрос для одного и того же количества идентификаторов продуктов). Это тестовый прогон, в котором я получаю 200 полных продуктов в каждом цикле. Журнал показывает (на мой взгляд) довольно случайное время запроса:

Извлечение 200 товаров из базы данных заняло: 00:00:01,9370364 секунды.
Извлечение 200 товаров из базы данных заняло: 00:01:06,8207146 секунд.
Извлечение 200 товаров из базы данных заняло: 00:00:58,5194938 секунд. .
Извлечение 200 товаров из базы данных заняло: 00:00:03,5447583 секунды.
Извлечение 200 товаров из базы данных заняло: 00:02:01,6096919 секунд.
Извлечение 200 товаров из базы данных заняло: 00: 00:03,2856333 секунды.
Извлечение 200 товаров из базы данных заняло: 00:02:04,8108302 секунды.
Извлечение 200 товаров из базы данных заняло: 00:00:03,4525576 секунд.
Извлечение 200 товаров из базы данных заняло: 00:01:04,4530670 секунд.

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

Кажется, это время запроса в базе данных - я также прикрепил профилировщик sql, который показывает такое же долгое время запроса.

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

Я предполагаю, что вопрос в том, что я должен искать, чтобы изменить производительность? Я использую 64-битную версию SQL Server Enterprise 2012.

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

Любые предложения приветствуются.

С наилучшими пожеланиями

Мортен


person Morten Skjoldager    schedule 06.06.2014    source источник
comment
Вы говорите, что у вас такие же результаты на профилировщике SQL (кстати, он не подключен), это означает, что это база данных, как это может быть Nhibernate? Я бы определенно установил NHProfiler, так как он может показать вам объем информации (статистику), которая поможет.   -  person Rippo    schedule 06.06.2014
comment
В приложении было нехорошее выражение :) Ну, это была просто информация, которая могла быть полезной. Я думал об этом. Хотя не уверен, что это много даст. Это только один вызов для выполнения запроса. Я все же попробую. Это отличный инструмент! Что меня беспокоит: это из-за блокировки? Или просто база данных исчерпала ресурсы?   -  person Morten Skjoldager    schedule 06.06.2014
comment
Проверяли ли вы отсутствующие индексы, неверный план запроса или устаревшую статистику? см., например, stackoverflow.com/a/15549211/1236044   -  person jbl    schedule 10.06.2014


Ответы (1)


Почему бы время от времени не вызывать ISession.Clear? Это удалит все записи из кеша первого уровня, которые вам, вероятно, не понадобятся. Или лучше используйте IStatelessSession вместо обычного ISession.

person Ricardo Peres    schedule 09.06.2014