67 votes

Critères Hibernate vs HQL: qui est plus rapide?

J'ai lu certaines anwers, mais je suis toujours confus. ¿Pourquoi? parce que les différences que vous avez mentionnés ne sont pas en relation avec la performance. ils sont en relation avec l'utilisation facile.(Objetc(critères) et SQL(hql)). Mais je voudrais savoir si les "critères" est plus lent que les requêtes hql pour une raison quelconque.

J'ai lu dans un autre anwers

"Il y a une différence en termes de performances entre les requêtes HQL et criteriaQuery, chaque fois que vous lancez une requête à l'aide de criteriaQuery, il crée un nouvel alias pour le nom de la table qui ne se reflète pas dans la dernière interrogé cache pour toute DB. Cela conduit à une surcharge de la compilation de la requête SQL générée, en prenant plus de temps à s'exécuter." par Varun Mehta.

Ceci est très proche de MAIS! j'ai lu dans un autre site(http://gary-rowe.com/agilestack/tag/hibernate/) Ce n'est plus le cas avec Hibernate 3.3 et au-dessus(merci de lire ceci: 9) Hibernate est lent parce que le SQL généré par les Critères de l'interface n'est pas compatible)

J'ai fait quelques test en essayant de trouver les différences, mais de générer à la fois qry et il n'est pas de modifier l'alias de la table.

Je suis très confus. Si quelqu'un sait la raison principale s'il vous plaît, pourriez-vous nous aider. Merci

145voto

Joshua Davis Points 1616

Je suis le gars qui a écrit le Hibernate 3 traducteur de requête en 2004, donc je sais quelque chose sur la façon dont il fonctionne.

Critères, en théorie, doit avoir moins de ressources qu'une requête HQL (sauf pour les requêtes nommées, sur lequel je reviendrai). C'est parce que les Critères n'a pas besoin d'analyser quoi que ce soit. Des requêtes HQL sont analysées avec un ANTLR d'analyseur et alors la résultante de l'AST est transformé en SQL. Cependant, avec HQL/JPAQL vous pouvez définir des requêtes nommées, où le SQL est généré lorsque l' SessionFactory démarre. En théorie, les requêtes nommées ont moins de frais généraux que les Critères.

Ainsi, en termes de SQL de génération de généraux, nous avons:

  1. Nommé HQL/JPAQL Requête SQL de génération de n'arrive qu'une fois.
  2. Critères - Pas besoin de l'analyser avant de générer.
  3. (non nommé) HQL/JPAQL Requête de l'Analyser, puis de générer.

Cela dit, le choix d'une requête technique basée sur la surcharge de l'analyse et de génération SQL est probablement une erreur à mon avis. Cette surcharge de travail est généralement très faible par rapport à l'exécution d'une véritable requête sur un vrai serveur de base de données avec des données réelles. Si ce traitement ne fait lorsque le profilage de l'application puis peut-être que vous devriez passer à une requête nommée.

Ici sont les choses que je considère au moment de décider entre les Critères et les HQL/JPAQL:

  • Tout d'abord, vous devez décider si vous êtes OK avec le fait d'avoir une dépendance sur Hibernate-API propriétaire dans votre code. JPA n'ont pas de Critères.
  • Critères est vraiment bon à la gestion de nombreux facultatif paramètres de recherche tels que vous pourriez trouver sur une page web typique avec un multi-paramètre "recherche de formulaire". Avec HQL, les développeurs ont tendance à virer de bord sur les expressions des clauses where avec StringBuilder (éviter cela!). Avec Critères, vous n'avez pas besoin de le faire. Hardik posté opinions similaires.
  • HQL/JPAQL peut être utilisé pour la plupart des autres choses, parce que le code a tendance à être plus petits et plus facile pour les développeurs à comprendre.
  • Vraiment requêtes fréquentes peuvent être transformées en requêtes nommées si vous utilisez les requêtes HQL. Je préfère le faire plus tard, après certains profils.

8voto

Rajeev Points 29

Je travaille sur des millions de disques. J'ai trouvé que HQL est beaucoup plus rapide que Criteria. Les critères sont très en retard dans les performances.

Si vous traitez beaucoup de données, optez pour HQL.

5voto

Hardik Mishra Points 7997

Je préfère surtout les requêtes de critères pour les requêtes dynamiques. Par exemple, il est beaucoup plus facile d'ajouter un ordre de manière dynamique ou de laisser certaines parties (par exemple, des restrictions) en fonction de certains paramètres.

D'autre part, j'utilise HQL pour les requêtes statiques et complexes, car il est beaucoup plus facile de comprendre / lire HQL. De plus, HQL est un peu plus puissant, par exemple, pour différents types de jointure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X