wake-up-neo.com

Kriterien für den Ruhezustand im Vergleich zu HQL: Was ist schneller?

Ich habe einige Antworten gelesen, aber ich bin immer noch verwirrt. Warum? weil die Unterschiede, die Sie erwähnt haben, nicht mit der Leistung zusammenhängen. Sie sind mit der einfachen Bedienung verbunden (Objetc (Kriterien) und SQL (hql)). Aber ich würde gerne wissen, ob "Kriterien" aus irgendeinem Grund langsamer sind als hql.

Ich habe das in einer anderen Antwort gelesen

"Es gibt einen Unterschied in Bezug auf die Leistung zwischen HQL und criterQuery. Jedes Mal, wenn Sie eine Abfrage mithilfe von criterQuery auslösen, wird ein neuer Alias ​​für den Tabellennamen erstellt, der nicht im zuletzt abgefragten Cache für eine DB enthalten ist. Dies führt zu einem Overhead von Kompilieren der generierten SQL, was mehr Zeit zur Ausführung erfordert. " von Varun Mehta.

Das ist sehr nah, ABER! Ich habe auf einer anderen Website gelesen (http://gary-rowe.com/agilestack/tag/hibernate/). Dies ist bei Hibernate 3.3 und höher nicht mehr der Fall Die Kriterienschnittstelle ist nicht konsistent.)

Ich habe einige Tests durchgeführt, um die Unterschiede herauszufinden, aber beide generieren Qrys und es ändert nicht den Alias ​​für die Tabelle.

Ich bin sehr verwirrt. Wenn jemand bitte den Hauptgrund kennt, könnten Sie uns helfen. Vielen Dank

63
kcobuntu

Ich bin der Typ, der 2004 den Hibernate 3-Abfrageübersetzer geschrieben hat, also weiß ich etwas darüber, wie es funktioniert.

Kriterien sollten theoretisch weniger Overhead haben als eine HQL-Abfrage (mit Ausnahme von benannten Abfragen, auf die ich noch näher eingehen werde). Dies liegt daran, dass Kriterien nichts analysieren müssen. HQL-Abfragen werden mit einem ANTLR-basierten Parser analysiert und das resultierende AST wird in SQL umgewandelt. Mit HQL/JPAQL können Sie jedoch benannte Abfragen definieren, bei denen die SQL beim Start von SessionFactory generiert wird. Theoretisch haben benannte Abfragen weniger Aufwand als Kriterien.

In Bezug auf den Aufwand für die SQL-Generierung haben wir also:

  1. Named HQL/JPAQL Query - Die SQL-Generierung erfolgt nur einmal.
  2. Kriterien - Keine Notwendigkeit zum Parsen vor dem Generieren.
  3. (nicht benannte) HQL/JPAQL-Abfrage - Analysieren und dann generieren.

Das heißt, eine Abfragetechnik basierend auf dem Aufwand von Parsing und SQL-Generierung zu wählen, ist meiner Meinung nach wahrscheinlich ein Fehler . Dieser Aufwand ist normalerweise sehr gering im Vergleich zur Ausführung einer echten Abfrage auf einem echten Datenbankserver mit echten Daten. Wenn dieser Overhead beim Profilieren der App tatsächlich auftritt, sollten Sie möglicherweise zu einer benannten Abfrage wechseln.

Folgendes berücksichtige ich bei der Entscheidung zwischen Kriterien und HQL/JPAQL:

  • Zunächst müssen Sie entscheiden, ob es Ihnen [~ # ~] gut geht [~ # ~] mit einem Abhängigkeit von Hibernate- proprietäre API in Ihrem Code. JPA hat keine Kriterien.
  • Kriterien können sehr gut mit vielen optionalen Suchparametern umgehen wie man es auf einer typischen Webseite mit einem Suchformular mit mehreren Parametern findet. Mit HQL neigen Entwickler dazu, mit StringBuilder (vermeiden Sie dies!) Where-Klausel-Ausdrücke anzugreifen. Mit Criteria müssen Sie das nicht tun. Hardik hat ähnliche Meinungen gepostet.
  • HQL/JPAQL kann für die meisten anderen Dinge verwendet werden, da der Code in der Regel kleiner und für Entwickler verständlicher ist.
  • Wirklich häufige Abfragen können in benannte Abfragen umgewandelt werden, wenn Sie HQL verwenden. Ich mache das lieber später, nachdem ich ein Profil erstellt habe.
141
Joshua Davis

Ich arbeite an Millionen von Aufzeichnungen. Ich fand, dass HQL viel schneller ist als Criteria. Kriterien hinken stark in der Leistung.

Wenn Sie mit vielen Daten zu tun haben, entscheiden Sie sich für HQL.

9
Rajeev

Andere Vorteile, die ich für Kriterien über HQL denke:

Das Schreiben von HQL macht den Code unordentlich. Es sieht nicht mehr danach aus, sauberen objektorientierten Code zu schreiben.

Beim Schreiben von Kriterienabfragen schlägt IDE) Intellisense vor, sodass die Wahrscheinlichkeit von Fehlern geringer ist, es sei denn, wir schreiben Variablennamen in doppelten Anführungszeichen.

5
omkar sirra

Ich bevorzuge vor allem Kriterienabfragen für dynamische Abfragen. Zum Beispiel ist es viel einfacher, eine Reihenfolge dynamisch hinzuzufügen oder einige Teile (z. B. Einschränkungen) in Abhängigkeit von einem Parameter wegzulassen.

Andererseits verwende ich HQL für statische und komplexe Abfragen, weil es viel einfacher ist, HQL zu verstehen/zu lesen. Außerdem ist HQL meiner Meinung nach ein bisschen leistungsfähiger, z. für verschiedene Join-Typen.

JPA und Ruhezustand - Kriterien vs. JPQL oder HQL

5
Hardik Mishra

Du hast recht und nicht. Die Ergebnisliste wird mit der Klasse org.hibernate.loader.Loader Aus der Datenbank oder dem Cache abgerufen. Wenn der Cache nicht aktiviert ist, wird die vorbereitete Anweisung mit dem in SessionFactoryImp erstellten Dialect-Objekt erstellt. Anweisungen werden also entweder per Listenaufruf initialisiert. Außerdem wird eine einfache Abfrage automatisch generiert. Grundsätzlich ist es eine Hilfe, aber es kann vorkommen, dass eine bestimmte Abfrage beim manuellen Schreiben effektiver ist.

3
Simon