Frage

Was sind die Leistung unterschiede zwischen hql und Kriterienapi und QueryOver?Gibt es Situationen, in denen einer schneller oder langsamer ist als der andere?

Bearbeiten:Ich habe die Frage mit QueryOver und Linq erweitert.

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

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

War es hilfreich?

Lösung

Die Leistungsmerkmale zwischen ICriteria und HQL variieren aus einem einfachen Grund geringfügig (ich weiß nichts über QueryOver ).

ICriteria-Abfragen versuchen standardmäßig, Ihre Abrufstrategien wie in Ihrem Mapping definiert zu implementieren, während HQL standardmäßig alles als faul betrachtet und von Ihren Join-Deklarationen in Ihrer Abfrage abhängt, um zu definieren, was eifrig abgerufen wird oder nicht.

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

Was wirklich zählt, ist die Steckbarkeit von ICriteria-Abfragen (siehe ICriteria .createCriteria().createCriteria () usw.), wobei die NH-Engine die ICriteria auflösen und versuchen muss, die gültigste SQL zu generieren.

Auf der anderen 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 Erstellungs- und Zuordnungsdefinitionen von ISessionFactory generiert und was nicht im Arbeitsspeicher vorhanden ist, sodass die Leistung gut ist.

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

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

Als Randnotiz führt das Deklarieren von so viel wie möglich in der Zuordnung zu einer präziseren SQL-Generierung sowie zu einer NHibernate-Operation, z. B. für die Zuordnung von Zeichenfolgeneigenschaften Length in der .hbm.xml führt dazu, dass NHibernate die Zeichenfolgenlängen überprüft, bevor es zur Datenbank geht.

Andere Tipps

In Bezug auf Queryover würde ich davon ausgehen, dass die Leistung mit der Kriterien-API identisch ist, da er als Erweiterung dieser API erstellt wird.Für äquivalente Anfragen in den beiden APIs würde ich also erwarten, dass dieselbe Datenbankabfrage erzeugt wird.Der einzige Unterschied, den ich zwischen Queryover und Criteria-Schnittstellen bemerkt habe, ist, dass ich die Queryover-Schnittstelle als "sauberer" und angenehmer zu sein, mit dem Sie arbeiten können.

In meiner Erfahrung hat die Kriterien-API mehr "Liebe" als die HQL-Schnittstelle erhalten.Ich habe in Fälle gelaufen, in denen ich bestimmte Abfragen mit der Kriterienschnittstelle ausdrücken könnte, die ich nicht äquivalente Möglichkeit finden konnte, in der HQL-Schnittstelle auszudrücken.

In Bezug auf die Leistung finde ich die Art und Weise, wie die Abfrage "gefragt" wird, hat mehr Leistung als die Auswahl der Kriterien-API gegenüber HQL gegen Queryover.Ich würde die Schnittstelle verwenden, die Ihnen die natürlichste Passform an Ihr Denken bietet.

Queryover ist ein sehr guter Ersatz für Kriterien in bester Hinsicht aufgrund der verbesserten Syntax und der Typsicherheit. Es sei jedoch darauf hingewiesen, dass die Verarbeitung der Lambda-Ausdrücke in der Queryover teuer sein kann (und ich denke, dass das Gleiche für Link-Abfragen beantragen würde). Bei der Ausführung der End-SQL-Abfrage dauert nicht mehr als andere Methoden (Icriteria, HQL), wodurch das Abfrageobjekt in die entsprechende SQL-Abfrage umgewandelt wird, dauert länger.

Als Beispiel entwickeln wir einen Antrag, der Hunderte von Queryover-Abfragen in einer Sekunde (mithilfe von ADO.NET-Batching-Support) ausläuft, und wir fanden die Umwandlung der Anfragen in Icriteria fast verdoppelt, dass die Fähigkeit, Abfragen auszuführen und die halbierte CPU-Nutzung auszuführen . Ich denke, der überliegende Verarbeitung, der an der Verarbeitung des Lambda-Ausdrucks beteiligt ist, kann viel reduziert werden, wenn Sie den Cache- und Abfrage von Sekunden aufbauen. Aber da dies nicht für unsere Anwendung geeignet ist, habe ich das nicht selbst getan.

In Bezug auf Ihre allgemeine Frage, wie schneller ist: Es hängt wirklich davon ab. Die einzige Surve-Fire-Art des Erzählens ist, ein Profil-Tool auszuführen (NHPROF arbeitet Wunder für Szenarien wie diese). Im Allgemeinen ist der HQL jedoch am nächsten, der der am nächsten stehenden SQL ist und daher am flexibelsten und ermöglicht Ihnen ein bisschen mehr Umfang, um Ihre Abfragen zu optimieren. Für die große Mehrheit der einfachen bis mittelschmelzenden Komplexitätsabfragen gibt es jedoch wenig keinen Unterschied zwischen Icriteria und HQL. Und Icriteria-Abfragen sind viel einfacher, mit dem Ihre Abfragen dynamisch gebaut werden.

Ich muss noch keinen Unterschied zwischen den beiden finden.Dass gesagt - HQL hat Funktionalität, die in den Kriterien-API nicht verfügbar ist.

meistens ist es eine Frage des Stils und der persönlichen Vorlieben, wenn Sie den früheren oder letzteren verwenden.Und die Übersetzung von Ihrer Abfrage in SQL berücksichtigt nicht viel, wenn es um Abfragen geht.

von den Menschen, die mehr als i wissen als ich: http://ayende.com/blog/archive/2009/06/01/Nhibernate-queries-ndash-should-i-use-hql-or-criteria.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top