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

StackOverflow https://stackoverflow.com/questions/3262642

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Кроме того, 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 проверит длину строк перед отправкой в ​​базу данных.

Другие советы

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

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

Что касается производительности, я нахожу тем, как запрос «спросил» имеет более подшипник на производительности, чем выбор критериев API против HQL против Queryover.Я бы использовал интерфейс, который предоставляет вам самые естественные пригодные для вашего мышления.

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

В качестве примера мы разрабатываем приложение, которое работало сотни запросов запросов в Queryover в секунду (используя поддержку дозирования ADO.NET), и мы обнаружили, что преобразование запросов в ICRITERIA почти удвоила нашу способность выполнять запросы и сократить полное использование CPU Отказ Я думаю, что накладные расходы, участвующие в обработке, выражение лямбда могут быть намного уменьшены, если вы используете кэш-память второго уровня и кэширование запросов; Но поскольку это не подходит для нашего приложения, я этого не сделал.

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

У меня еще нет никакой разницы между ними.Это, как говорят, - HQL имеет функциональность, которые не доступны в критериях-API.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top