Hibernate Query работает медленно в системе, но быстро при непосредственном запуске - PullRequest
5 голосов
/ 13 марта 2009

У меня проблема, подобная включенной в этой неделе подкаста.

У нас есть приложение Java, использующее Hibernate с Sql Server 2005.

Hibernate генерирует запрос для нас, который занимает около 20 минут.

Если мы возьмем тот же запрос с использованием show_sql и заменим знаки вопроса постоянным значением, ответ будет возвращен немедленно.

Я думаю, что нам нужен параметр (перекомпилировать), но я не могу понять, как это сделать с HQL.

Пожалуйста, помогите!

Ответы [ 3 ]

4 голосов
/ 25 марта 2009

Из описания вашей проблемы звучит так, будто вы сталкиваетесь с анализом параметров. По сути, SQL Server создает план запроса на основе более старого набора значений параметров, которые были переданы и которые не создают эффективный план выполнения для текущего выполняющегося запроса.

Обычно я решаю эту проблему, передавая значения параметров в локальные переменные и используя их в моем запросе или используя OPTION (RECOMPILE). Однако, так как вы используете Hibernate, мое обычное решение не подходит для вас. Насколько я понимаю, лучшим вариантом будет использование Hibernate для запуска собственного SQL-запроса с использованием prepareStatement () или createSQLQuery (), который, к сожалению, устраняет некоторые преимущества использования Hibernate.

1 голос
/ 15 марта 2009

По моему опыту, основная проблема со сложными запросами в Hibernate заключается не в самом запросе, а в создании всех объектов, представляющих набор результатов.

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

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

0 голосов
/ 15 марта 2009

Вы должны опубликовать свое отображение и оператор HQL. Если вы используете «join» в вашем HQL, вы можете посмотреть, что именно получает Hibernate. Может оказаться, что сам запрос прост, но Hibernate извлекает тонны данных до того, как получает их.

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