Los cuales uno tiene un mejor rendimiento?
-
03-10-2019 - |
Pregunta
escribo misma consulta con dos enfoque mediante el uso de NHibernate:
1- utilizando HQL
como a continuación
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- utilizando ICriteria
y SetProjections
como a continuación
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;
}
}
Ahora mi pregunta es la que se tiene un mejor rendimiento? ¿Por qué?
Solución
creo que la mejor manera de obtener un indicador de que está mejor sería como se indica aquí. Ir descarga nhProf y el perfil de la misma.
Si usted desea más detalles tome el SQL que se genera y luego ejecutarlo a través de perfiles de SQL Server para obtener una mejor idea de lo que está haciendo.
Pero, honestamente, si usted tiene cualquier cantidad de datos en su base de datos haciendo una consulta como le dará resultados HORRIBLE horrible.
Yo recomendaría encarecidamente que configure la indexación de texto completo en SQL Server y luego usar esto:
para registrar el texto libre y contiene funciones de NHibernate.
otro gran ejemplo de integración con consultas ICriteria está aquí:
http: // xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/
Alternativamente, puede utilizar Lucene.NET hacer la indexación de texto completo también.
Otros consejos
No hay una diferencia significativa entre el rendimiento intrínseco HQL y Criterios. Son sólo diferentes APIs para expresar una consulta que al final va a ser traducido a SQL, eso es todo.
Los criterios (sin doble sentido) para elegir uno sobre el otro API depende del contexto de uso. Por ejemplo, en su caso particular, me gustaría ir con los criterios. La construcción de una consulta a partir de la concatenación de cadenas es muy propenso a errores y hay que tener mucho cuidado de no ser vulnerables a los ataques de inyección . Al menos el conjunto propertyValue
a ser un parámetro IQuery
...