NHibernate HQL по сравнению с CriteriaAPI по сравнению с QueryOver по сравнению с Linq. Производительность

Каковы различия в производительности между hql и criteriaApi и QueryOver? Есть ли какие-либо ситуации, где каждый быстрее или медленнее, чем другой?

Править: Я расширил вопрос с помощью QueryOver и Linq.

=============================================

Ну, я не уверен, какой ответ отметить как ответ, таким образом, я отмечу сообщения с большей частью VoteUp.Я не знаю. Это - на самом деле больше обсуждения, чем вопрос.

15
задан mynkow 12 December 2012 в 11:27
поделиться

3 ответа

Характеристики производительности между ICriteria и HQL отличаются незначительно (я не знаю о QueryOver) по одной простой причине.

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

Кроме того, ICriteria зависит от маппинга для передачи параметров, тогда как HQL позволяет использовать явные типы параметров, например, IQuery.SetInt32("fooParam", 5);

Что действительно важно, так это подключаемость запросов ICriteria (см. ICriteria.CreateCriteria().CreateCriteria() и т.д.), где движок NH должен будет разрешить ICriteria и попытаться сгенерировать наиболее корректный SQL.

С другой стороны, вероятно, легче предсказать, даст ли HQL-запрос последовательные результаты, что облегчает использование QueryCache.

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

Фактическая генерация SQL в обоих случаях происходит по-разному, и это является причиной того, что утилита для ICriteria -> HQL не существует.

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

В качестве примечания, декларирование как можно большего в отображении приведет к более краткой генерации sql и работе NHibernate, например, для строковых свойств отображение Length в .hbm.xml приведет к тому, что NHibernate будет проверять длину строки перед отправкой в базу данных.

12
ответ дан 1 December 2019 в 03:13
поделиться

Я еще не нашел никакой разницы между ними. При этом hql имеет функциональность, недоступную в Criteria-API.

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

От людей, которые знают больше меня: http://ayende.com/Blog/archive/2009/06/01/nhibernate-queries-ndash-should-i-use-hql-or-criteria .aspx

1
ответ дан 1 December 2019 в 03:13
поделиться

Что касается QueryOver, я бы ожидал, что производительность будет идентична API Criteria, поскольку он создан как расширение этого API. Поэтому для эквивалентных запросов в двух API я бы ожидал, что будет сгенерирован один и тот же запрос к базе данных. Единственное различие, которое я заметил между интерфейсами QueryOver и Criteria, заключается в том, что интерфейс QueryOver мне кажется "чище" и приятнее в работе.

По моему опыту, API Criteria получил больше "любви", чем интерфейс HQL. Я сталкивался со случаями, когда я мог выразить определенные запросы с помощью интерфейса критериев, которые я не мог найти эквивалентный способ выразить в интерфейсе HQL.

Что касается производительности, я считаю, что способ "запроса" имеет большее влияние на производительность, чем выбор API Criteria по сравнению с HQL по сравнению с QueryOver. Я бы использовал тот интерфейс, который обеспечивает наиболее естественное соответствие вашему мышлению.

6
ответ дан 1 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

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