Es macht mich verrückt. Die Auswahl von hibernate simple select ist so langsam, verglichen mit dem Ausführen dieser Abfrage direkt über Navicat. Was ist interessanter? Das Ausführen dieser Abfrage mit der lokalen Datenbank ist sehr schnell, aber es ist wirklich schlecht, es remote zu verwenden.
Ich mache folgende Hibernate native SQL-Abfrage (da HQL oder Criteria nicht linken Join unterstützen):
%Vor%Struktur der Entität spielt keine Rolle. Für die Tabellen SALES_UNIT und SALES_UNIT_RELATION gibt es einen 28k-Datensatz.
Die Ergebnisse, die auf meinem lokalen JBoss mit lokaler Datenbank laufen, liegen bei 30-120ms. Während der Ausführung auf Remote -Datenbankm, lokaler JBoss (gleiche Daten), ergibt sich eine Zeit zwischen 30000-40000ms. Wenn ich diese Abfrage mit Navicat durchführe, sind sowohl lokale als auch Remote-Anrufe sehr schnell (20-30ms).
Sowohl die lokale als auch die entfernte Datenbank wurden auf die gleiche Weise installiert - & gt; Oracle Enterprise Edition 11.2.0.1.0.
Was könnte das Problem dieser schlechten Leistung sein? Wie kann ich es debuggen?
Lesen Sie hierzu: Einfache Hibernate-Abfrage, die sehr langsam zurückkehrt , aber Konstruktoren setzen hat nichts geändert
BEARBEITEN.
SALES_UNIT Tabelle enthält einige grundlegende Informationen über Verkaufseinheitsknoten wie Name und usw. Die einzige Assoziation ist die Tabelle SALES_UNIT_TYPE, wie ManyToOne. Der Primärschlüssel ist ID und das Feld VALID_FROM_DTTM ist das Datum.
SALES_UNIT_RELATION enthält die Beziehung PARENT-CHILD zwischen Verkaufseinheitsknoten. Besteht aus SALES_UNIT_PARENT_ID, SALES_UNIT_CHILD_ID und VALID_TO_DTTM / VALID_FROM_DTTM. Keine Verknüpfung mit Tabellen Die PK ist hier ..PARENT_ID, ..CHILD_ID und VALID_FROM_DTTM
Vielen Dank für Ihre Hilfe. Nach langer Zeit mit dem Problem zu kämpfen, half mir schließlich Kaliatech Antwort das Problem zu debuggen.
Zuerst habe ich einen schrecklichen Fehler in meiner Frage gemacht. Ich schrieb das:
Das Ausführen dieser Abfrage mit der lokalen Datenbank ist sehr schnell, aber die Remote-Nutzung ist sehr schlecht.
Da ist es nicht ganz wahr. Die Abfrage, die ich in Hibernate gemacht habe, sieht wie folgt aus:
%Vor%Aber die eigentliche Abfrage, die ich mit SQL PLus oder Navicat zum Beispiel gemacht habe, war:
%Vor% Bitte beachten Sie, dass die erste Abfrageauswahl startet: select s.* ...
und die zweite ist select * ...
. Und das war der Grund für diese schlechte Leistung. Jetzt sind beide Abfragen in kürzester Zeit erledigt. Die Frage ist, was ist der Unterschied: Leistungsproblem: Unterschied zwischen ausgewählten s. * vs wählen Sie *
Um eine definitive Antwort zu erhalten, denke ich, dass mehr Informationen benötigt werden. In erster Linie:
Verfügen Sie in der SalesUnit-Entitätsklasse über Entitätsverknüpfungs- oder Sammlungsfelder? & lt; - Dies wäre meine erste Schätzung für die Leistungsunterschiede, die Sie anstelle von anderen Informationen sehen.
Haben Sie das gleiche Leistungsproblem, wenn Sie die Abfrage mit demselben JDBC-Treiber in einer Nicht-Hibernate-Umgebung ausführen? (d. h. Verwenden eines JDBC-Clients von Drittanbietern wie DbVisualizer ).
Auch
Obwohl es unmöglich ist, mit Informationen in Ihrer Frage sicher zu wissen, denke ich , dass Sie alle SalesUnits abfragen möchten, die keine untergeordnete SalesUnit haben. Richtig? (Es hängt davon ab, wofür Sie die sales_unit_relation-Tabelle verwenden.) Wenn ja, haben Sie Ihre Abfrage folgendermaßen geschrieben:
%Vor%Aber ich denke Sie wollten wahrscheinlich etwas mehr so:
%Vor%Ihre Abfrage stimmt mit der Spalte überein, die Sie in der WHERE-Klausel für null filtern. Wenn das wirklich das ist, was Sie wollten, dann hätten Sie es auch als INNER JOIN ohne die WHERE-Klausel schreiben können, oder?
Zuletzt,
Ich mache nach Hibernate native SQL-Abfrage (als HQL oder Kriterien linker Join wird nicht unterstützt)
Das ist falsch wie gesagt. HQL und Kriterien unterstützen linksbasierten Join nur dann nicht, wenn keine Beziehung zwischen Entitäten / Tabellen besteht, die abgefragt werden. Die Annahme für Ihr Beispiel wäre also, dass es keine zugeordnete Entitätsbeziehung zwischen SalesUnit und der Entität / Assoziation gibt, die die sales_unit_relation-Tabelle darstellt. (Eine native Abfrage sollte unabhängig davon funktionieren, aber wenn es eine zugeordnete Beziehung gibt, wäre ein Vorteil für die Verwendung von HQL / Kriterien, dass Sie left join fetch
ausführen könnten.)
Tags und Links sql oracle hibernate performance