2010-07-16 16 views
15

Was sind die Leistung Unterschiede zwischen dem HQL und KriterienApi und QueryOver? Gibt es Situationen, in denen einer schneller oder langsamer ist als der andere?NHibernate HQL vs KriterienAPI vs QueryOver vs Linq. Leistung

Edit: Ich erweiterte die Frage mit QueryOver und Linq.

=============================================

Nun, ich bin mir nicht sicher, welche Antwort zu markieren als Antwort, also werde ich Beiträge mit den meisten VoteUp markieren. Ich weiß es nicht. Das ist eigentlich mehr Diskussion als eine Frage.

Antwort

11

Die Leistungsmerkmale zwischen ICriteria und HQL variieren nach und nach (ich weiß nicht, über QueryOver) aus einem einfachen Grund.

ICriteria-Abfragen werden standardmäßig versuchen, Ihre Abrufstrategien wie in Ihrem Mapping definiert zu implementieren, während HQL standardmäßig alles Lazy berücksichtigt und abhängig von Ihren Join-Deklarationen innerhalb Ihrer Abfrage definiert, was eifrig abgerufen wird.

Zusätzlich hängt ICriteria von der Abbildung für die Parameterübergabe ab, wohingegen HQL explizite Parametertypen, z. IQuery.SetInt32 ("fooParam", 5);

Was wirklich wichtig ist, ist die Pluggability von ICriteria-Abfragen (siehe ICriteria.CreateCriteria(). CreateCriteria() etc.), wo die NH-Engine die ICriteria auflösen und versuchen muss, das valideste SQL zu generieren.

Auf der gegenüberliegenden Seite ist es wahrscheinlich einfacher vorherzusagen, ob eine HQL-Abfrage konsistente Ergebnisse liefert und somit die Verwendung von QueryCache erleichtert.

In beiden Fällen wird die Konfiguration einmal mit den ISessionFactory-Erstellungs- und Mapping-Definitionen generiert, und what-not sind im Arbeitsspeicher, daher ist die Leistung gut.

Die eigentliche SQL-Generierung ist unterschiedlich zwischen den beiden gemacht und das ist der Grund, dass ein Dienstprogramm für ICriteria -> HQL nicht existiert.

Am Ende hat meine Erfahrung gezeigt, dass die Leistung zwischen den 2 ist wahrscheinlich die gleichen geben oder einige Millisekunden.

Als Randbemerkung, sowie NHibernate Betrieb, zum Beispiel in prägnanter SQL-Generierung für die Length in der .hbm.xml Mapping-String-Eigenschaften führen so weit wie möglich in der Abbildung erklärt in NHibernate Überprüfung Zeichenfolge führen Längen, bevor Sie in die Datenbank gehen.

+1

Sehr schön. Lassen Sie uns sehen, was die anderen über QueryOver sagen. – mynkow

1

Ich habe noch keinen Unterschied zwischen den beiden zu finden. Davon abgesehen hat hql Funktionalität, die in der Kriterien-API nicht verfügbar ist.

Meistens ist es eine Frage des Stils und der persönlichen Vorliebe, wenn Sie das erstere oder das letztere verwenden. Und die Übersetzung von Ihrer Abfrage nach SQL berücksichtigt nicht viel, wenn es um Abfragen geht.

Von den Leuten, die mehr als ich weiß: http://ayende.com/Blog/archive/2009/06/01/nhibernate-queries-ndash-should-i-use-hql-or-criteria.aspx

+0

Nun, ich hatte Angst, dass dies passieren wird. Ich habe versucht zu verstehen, was schneller ist und warum. Dies ist keine Wahl zwischen den beiden. Eigentlich habe ich meine Wahl schon. Lassen Sie uns also auf die Leistung der HQL und der Kriterien zurückkommen. PS: Übrigens sagt Ayende in den Kommentaren, dass die Leistung gleich ist, aber ich bin mir nicht sehr sicher. Ich denke, dass es Situationen gibt, in denen wir Leistungsprobleme haben. Dies ist nur eine Vermutung. – mynkow

+0

Sie sagen, dass Sie Leistungsprobleme haben. Welche Methode verwendest du? Ich bevorzuge Kriterien, weil ich denke, Hibernate macht die schnellste Abfrage für Sie – Michel

+2

In meiner Erfahrung ist es mangelndes Verständnis einer der APIs, die es langsamer erscheinen lässt. Haben Sie darüber nachgedacht, NHProfiler/einen anderen Profiler zu testen, um zu sehen, was die Zeit kostet? Wenn Sie ein Beispiel haben, das in einem der beiden schneller läuft - versuchen Sie, den ausgegebenen Raw-Sql zu betrachten - das ist normalerweise der Übeltäter. – Goblin

6

Soweit AbfrageOver betroffen ist, würde ich erwarten, dass die Leistung identisch mit der Criteria API ist, da es als eine Erweiterung dieser API erstellt wird. Bei äquivalenten Abfragen in den beiden APIs würde ich daher erwarten, dass dieselbe Datenbankabfrage generiert wird. Der einzige Unterschied, den ich zwischen den Schnittstellen QueryOver und Criteria festgestellt habe, ist, dass ich die QueryOver-Schnittstelle als "sauberer" und angenehmer empfinde.

Nach meiner Erfahrung hat die Kriterien-API mehr "Liebe" als die HQL-Schnittstelle erhalten. Ich bin auf Fälle gestoßen, in denen ich bestimmte Abfragen mit der Kriterienschnittstelle ausdrücken konnte, die ich eine äquivalente Weise nicht finden konnte, in der HQL Schnittstelle auszudrücken.

In Bezug auf die Leistung, finde ich die Art, wie die Abfrage "gefragt" hat mehr Einfluss auf die Leistung als die Auswahl der Kriterien API im Vergleich zu HQL im Vergleich zu QueryOver. Ich würde die Schnittstelle verwenden, die Ihnen die natürlichste Anpassung an Ihr Denken bietet.

4

QueryOver ist ein sehr guter Ersatz für Kriterien in den meisten Punkten wegen der verbesserten Syntax und der Typ-Sicherheit. Es sollte jedoch beachtet werden, dass die Verarbeitung der Lambda-Ausdrücke in QueryOver teuer sein kann (und ich denke, das gleiche würde für LINQ-Abfragen gelten). Während die Ausführung der SQL-Endeabfrage nicht länger dauert als andere Methoden (ICriteria, HQL), dauert die Umwandlung des Abfrageobjekts in die entsprechende SQL-Abfrage länger.

Als Beispiel haben wir eine Anwendung entwickelt, die Hunderte von QueryOver-Abfragen pro Sekunde ausführt (mit ADO.NET Batching-Unterstützung) und wir haben festgestellt, dass die Konvertierung der Abfragen nach ICriteria unsere Fähigkeit, Abfragen auszuführen, halbiert hat. Verwendung. Ich nehme an, dass der Overhead, der mit der Verarbeitung des Lambda-Ausdrucks verbunden ist, stark reduziert werden kann, wenn Sie den Cache der zweiten Ebene und das Zwischenspeichern von Abfragen verwenden. aber da dies für unsere Anwendung nicht geeignet ist, habe ich das selbst nicht gemacht.

In Bezug auf Ihre allgemeinere Frage, welche schneller ist: es kommt darauf an. Die einzige sichere Methode zum Erzählen ist das Ausführen eines Profilierungswerkzeugs (NHProf wirkt Wunder für solche Szenarien). Im Allgemeinen ist HQL SQL am ähnlichsten und daher am flexibelsten, was Ihnen mehr Spielraum für die Optimierung Ihrer Abfragen gibt. Bei den meisten einfachen bis mittleren Komplexitätsabfragen gibt es jedoch kaum Unterschiede zwischen ICriteria und HQL. Mit ICriteria-Abfragen lässt sich viel einfacher arbeiten, wenn Ihre Abfragen dynamisch erstellt werden.

+0

wir haben einige Performance-Treffer mit Query über gesehen. Die Lambda-Zusammenstellungen können ziemlich teuer sein. –