Выбор NHibernate становится экспоненциально медленным

Моя проблема состоит в том, что NHibernate становится экспоненциально медленным при выборке записей от базы данных. У меня был запрос, чтобы в основном вытянуть все данные из очень большой базы данных, которая будет использоваться в отчете.

Я фигурировал, хорошо так как я не могу получить все записи в одном выстреле, потому что recordset является настолько большим, я думал попытка, разбивающая его. В основном я выполняю итерации через диапазоны индекса, т.е. записываю идентификатор x к y, затем y+1 к z, и т.д.

Каждый набор результатов о 10megs. Первые приблизительно 20 получений по запросу занимают меньше чем минуту каждый, затем на следующем получении по запросу, требуется 10 минут, затем 30 минут и 1 час. Я остановил программу там, не хотел ожидать, пока следующее получение по запросу не произойдет. Я запустил программу, снова начинающую с индекса, где я кончил, снова, первые приблизительно 20 получений по запросу действительно быстры, затем по некоторой нечетной причине существует основное замедление.

Любая справка значительно ценилась бы.

6
задан Bernard 27 January 2010 в 23:38
поделиться

4 ответа

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

Если это так, вы можете попробовать периодическую сессию. Прижмите () или сеанс. Evict (объект), который удаляет объекты из кэша, так что NH не попытается сделать базу данных в соответствии с ними. Вы всегда можете подключить объекты позже, если вы хотите, чтобы «обратить внимание» на них.

Отредактируйте : Или используйте сеанс без природы. Вот пример .

8
ответ дан 8 December 2019 в 18:36
поделиться

Как вариант вы можете попробовать использовать stainessSessionsess. Это не отслеживает все тянутые объекты и не замедлит ваше приложение

3
ответ дан 8 December 2019 в 18:36
поделиться

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

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

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

Интерес?: Оптимизация производительности в Nibernate

1
ответ дан 8 December 2019 в 18:36
поделиться

Существует несколько способов повышения производительности Nhiberante

  • кэша второго уровня
  • Стремление загрузки для предотвращения выбора N + 1
  • Несколько способов вытеснить производительность из сопоставления
  • Изменение индексов базы данных

, когда требуется так, как вы описываете, я не думаю, что какая-то веща описывает выше, будет работать достаточно хорошо для вас.

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

1
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: