Какие преимущества имеет HQL над SQL для запросов Group By - PullRequest
4 голосов
/ 09 января 2009

Я концентрируюсь на этом вопросе на «отчетных» запросах (count, avg и т. Д., Т. Е. На тех, которые не возвращают саму модель предметной области), и мне просто было интересно, есть ли какое-либо преимущество в производительности при использовании HQL, так как он может использовать кэш второго уровня. Или, может быть, даже лучше - кешировать весь запрос.

Очевидное подразумеваемое преимущество состоит в том, что NHibernate знает, как называются имена столбцов, так как он уже знает о отображении модели.

Какие еще преимущества я должен знать?

[Я использую NHibernate, но я предполагаю, что в этом случае то, что относится к Hibernate, будет в равной степени применимо и к NHibernate]

Ответы [ 4 ]

2 голосов
/ 09 января 2009

Есть ноль преимуществ. HQL не будет превосходить прямой запрос к базе данных для агрегирования и вычисления данных. Результат примерно такой:

Select count(*), dept from employees group by dept

Всегда будет работать быстрее в БД, чем в HQL. Заметьте, я говорю всегда , потому что глупо придерживаться образа мышления «зависит от вашей ситуации». Если это связано с данными и агрегацией данных; сделать это в SQL.

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

Объекты в кэше второго уровня извлекаются только по идентификатору, поэтому Hibernate всегда будет запускать запрос для получения списка идентификаторов, а затем считывать эти объекты либо из кэша второго уровня, либо с помощью другого запроса.

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

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

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

0 голосов
/ 31 марта 2011

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

Но так как вы специально спросили о отчетах о запросах и производительности , я не могу думать о каких-либо практических преимуществах (я скрываю тот факт, что у вас есть и другие преимущества, такие как доступ к данным согласованность, запросы ORM против SQL (в большинстве случаев проще написать запрос на HQL), преобразования типов данных и т. д.)

0 голосов
/ 09 января 2009

HQL - это язык объектных запросов. SQL - это язык реляционных запросов.

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