NHibernate HQL против критериевAPI против QueryOver против Linq. Спектакль - PullRequest
15 голосов
/ 16 июля 2010

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

Редактировать: я расширил вопрос с помощью QueryOver и Linq.

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

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

Ответы [ 4 ]

12 голосов
/ 16 июля 2010

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

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

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

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

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

В любом случае конфигурация генерируется один раз сИСЭОпределения создания и отображения sionFactory и что-то еще находятся в памяти, поэтому производительность хорошая.

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

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

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

6 голосов
/ 19 августа 2010

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

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

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

4 голосов
/ 10 октября 2011

QueryOver - это очень хорошая замена Criteria во многих отношениях благодаря улучшенному синтаксису и безопасности типов.Однако следует отметить, что обработка лямбда-выражений в QueryOver может быть дорогостоящей (и я предполагаю, что то же самое относится и к запросам LINQ).Таким образом, хотя выполнение запроса конца SQL не занимает больше времени, чем другие методы (ICriteria, HQL), преобразование объекта запроса в соответствующий запрос SQL занимает больше времени.

В качестве примера, мы разрабатывали приложениеэто выполняло сотни запросов QueryOver в секунду (с использованием поддержки пакетной обработки ADO.NET), и мы обнаружили, что преобразование запросов в ICriteria почти удвоило нашу способность выполнять запросы И вдвое сократило использование ЦП.Я предполагаю, что издержки, связанные с обработкой лямбда-выражения, могут быть значительно уменьшены, если вы используете кэш второго уровня и кеширование запросов;но поскольку это не подходит для нашего приложения, я сам этого не делал.

Относительно вашего более общего вопроса о том, что быстрее: это действительно зависит.Единственный надежный способ рассказать об этом - запустить инструмент профилирования (NHProf творит чудеса для таких сценариев, как этот).Но, вообще говоря, HQL является наиболее близким к SQL и, следовательно, наиболее гибким, позволяя вам немного расширить возможности для оптимизации ваших запросов.Тем не менее, для подавляющего большинства простых и промежуточных запросов сложности между ICriteria и HQL практически нет различий.А с запросами ICriteria работать гораздо проще, если они создаются динамически.

1 голос
/ 16 июля 2010

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

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

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

...