2010-05-06 5 views
2

J'écris même requête avec approche à deux en utilisant NHibernate:Lequel a de meilleures performances?

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; 
    } 
} 

Ma question est celui qui a une meilleure performance? Pourquoi?

+1

Avez-vous mesuré les performances des deux? Qu'est-ce que cela vous a dit? –

+1

Avez-vous essayé de voir quel sql ils font tous les deux avec NHProf? Si le SQL est le même que la performance devrait être similaire. – chrissie1

+0

@Binary Worrier: avec mes données, HQl = 311.72 ms et ICriteria = 281.008 ms. HQL convertit en ICriteria, est-ce vrai? –

Répondre

2

Je pense que la meilleure façon d'obtenir une métrique de ce qui est mieux serait comme indiqué ici. Allez télécharger nhProf et le profil.

http://nhprof.com/

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, une requête LIKE vous donnera d'horribles résultats HORRIBLE.

Je recommande fortement que vous configurez l'indexation de texte intégral dans SQL Server puis utilisez ceci:

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

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.

2

Il n'y a pas de différence de performance intrinsèque significative entre HQL et les critères. Ce ne sont que des API différentes pour exprimer une requête qui sera finalement traduite en SQL, c'est tout.

Le critère (sans jeu de mots) pour choisir une API par rapport à l'autre dépend du contexte d'utilisation. Par exemple, dans votre cas particulier, j'irais avec Critères. Construire une requête à partir de la concaténation de chaînes est assez sujet aux erreurs et vous devez faire très attention de ne pas être vulnerable to injection attacks. Au moins, définissez le propertyValue comme paramètre IQuery ...

Questions connexes