Оптимизация Hql-запроса - вернуть индексированный идентификатор или весь объект - PullRequest
1 голос
/ 15 июня 2011

У меня есть таблица данных с cca. 327 000 записей. (SQL Server 2005, Hibernate 3) Я должен создать отчет, который запрашивает эту таблицу 300 раз. Hql-запрос выглядит так:

select hist from HistoryTable hist where year(hist.date) = :year and 
        hist.user.userId = :userId and hist.entryType = :created

Мне нужно подождать 3 минуты для генерации отчета, так есть ли способ оптимизировать этот запрос, чтобы он выполнялся быстрее? Хотелось бы мне вернуть hist.id (потому что это первичный ключ, поэтому он индексируется, и я думаю, что он ищется быстрее) вместо всего объекта hist, а затем получить объект History через его id? Может быть Hibernate делает то же самое, и это не обязательно, и тогда ничего не поделаешь. Есть идеи?

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Не думаю, что вам так сильно удастся сначала получить первичные ключи. Это только увеличит количество запросов, которые вам нужно выполнить (и, следовательно, время, которое требуется).

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

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

0 голосов
/ 15 июня 2011

Также убедитесь, что ваши ассоциации (например, hist.user, hist.user.somethingElseYetAgain) загружаются лениво и не рвутся. В противном случае ваши запросы будут объединяться гораздо больше, чем необходимо, и создавать экземпляры вместо прокси объектов.

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

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