Lequel ont de meilleures performances?
-
03-10-2019 - |
Question
Je vous écris même requête avec approche à deux en utilisant NHibernate:
1 en utilisant HQL
comme ci-dessous
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 en utilisant ICriteria
et SetProjections
comme ci-dessous
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;
}
}
Maintenant, ma question est celle que l'on a de meilleures performances? pourquoi?
La solution
Je pense que la meilleure façon d'obtenir une métrique qui est de mieux serait comme cela a été dit ici. Go télécharger nhProf et profil il.
Si vous voulez plus de détails, prendre la sql qui est généré et puis exécutez-le par profileur SQL Server pour obtenir une meilleure idée de ce qu'il fait.
Mais honnêtement, si vous avez une quantité de données dans votre base de données faisant une requête comme vous donnera des résultats horribles HORRIBLE.
Je recommande fortement que vous configurez l'indexation de texte intégral dans SQL Server puis utilisez ceci:
pour enregistrer le texte libre et contient des fonctions dans nHibernate.
un autre exemple d'intégrer des requêtes ICriteria est ici:
http: // xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/
Vous pouvez également utiliser Lucene.NET pour faire l'indexation en texte intégral ainsi.
Autres conseils
Il n'y a pas de différence significative de la performance intrinsèque entre HQL et critères. Ils sont juste différents API pour exprimer une requête qui à la fin sera traduit à SQL, c'est tout.
Les critères (sans jeu de mots) pour choisir une API sur l'autre dépend du contexte d'utilisation. Par exemple, dans votre cas particulier, je partirais avec des critères. Création d'une requête de concaténation de chaîne est assez sujette à erreur et vous devez être très prudent de ne pas être vulnérables aux attaques par injection . Au moins l'ensemble propertyValue
être un paramètre IQuery
...