2010-05-06 2 views
2

я пишу тот же запрос с двумя подхода с использованием NHibernate:У кого лучше производительность?

1- используя HQL как ниже

public long RetrieveHQLCount<T>(string propertyName, object propertyValue) 
{ 
    using (ISession session = m_SessionFactory.OpenSession()) 
    { 
     long r = Convert.ToInt64(session.CreateQuery("select count(o) from " + typeof(T).Name + " as o" + " where o." + propertyName + " like '" + propertyValue + "%'").UniqueResult()); 
     return r; 
    } 
} 

2- с использованием ICriteria и SetProjections как ниже

public long RetrieveCount<T>(string propertyName, object propertyValue) 
{ 
    using (ISession session = m_SessionFactory.OpenSession()) 
    { 
     // Create a criteria object with the specified criteria 
     ICriteria criteria = session.CreateCriteria(typeof(T)); 
     criteria.Add(Expression.InsensitiveLike(propertyName, propertyValue)) 
      .SetProjection(Projections.Count(propertyName)); 

     long count = Convert.ToInt64(criteria.UniqueResult()); 

     // Set return value 
     return count; 
    } 
} 

Теперь мой вопрос это то, что имеет лучшую производительность? Зачем?

+1

Вы оценили производительность обоих? Что это вам сказал? –

+1

Вы пытались увидеть, что они делают с NHProf? Если SQL такой же, как и производительность, он должен быть схожим. – chrissie1

+0

@ Бинарный Worrier: с моими данными, HQl = 311,72 мс и ICriteria = 281,008 мс. HQL превращается в ICriteria, правда? –

ответ

2

Я думаю, что лучший способ получить метрику, которая лучше, будет такой, как было сказано здесь. Загрузите nhProf и профайл.

http://nhprof.com/

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

Но, честно говоря, если у вас есть какое-то количество данных в базе данных, которые делают запрос LIKE, вы получите ужасные результаты HORRIBLE.

Я настоятельно рекомендую вам установить полнотекстовой индексации в SQL Server, а затем использовать это:

http://nhforge.org/blogs/nhibernate/archive/2009/03/13/registering-freetext-or-contains-functions-into-a-nhibernate-dialect.aspx

зарегистрировать FREETEXT и содержит функции в NHibernate.

еще один пример интеграции с запросами ICriteria здесь:

http://xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/

В качестве альтернативы вы можете использовать Lucene.Net сделать полное индексирование текста, а также.

2

Не существует существенной внутренней разницы в производительности между HQL и критериями. Они просто разные API, чтобы выразить запрос, который в конце концов будет переведен на SQL, вот и все.

Критерии (без каламбур) для выбора одного API над другим зависят от контекста использования. Например, в вашем конкретном случае я бы пошел с критериями. Построение запроса из конкатенации строк довольно подвержено ошибкам, и вы должны быть очень осторожны, чтобы не быть vulnerable to injection attacks. По крайней мере, установить propertyValue в качестве параметра IQuery ...

Смежные вопросы