Какие из них имеют лучшую производительность? - PullRequest
2 голосов
/ 06 мая 2010

Я пишу тот же запрос с двумя подходами, используя 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;
    }
}

Теперь мой вопрос: у кого лучше производительность? почему?

Ответы [ 2 ]

2 голосов
/ 06 мая 2010

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

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

2 голосов
/ 06 мая 2010

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

http://nhprof.com/

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

Но, честно говоря, если у вас есть какое-то количество данных в вашей базе данных, выполнение запроса LIKE даст вам ужасные УЖАСНЫЕ результаты.

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

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

для регистрации свободного текста и содержит функции в nHibernate.

еще один отличный пример интеграции с запросами ICriteria:

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

Либо вы можете использовать Lucene.NET для полнотекстовой индексации.

...