Ich bin hauptsächlich ein Java-Entwickler, der mit Hibernate arbeitet, und in einigen meiner Anwendungsfälle habe ich Abfragen, die im Vergleich zu dem, was ich erwarte, sehr langsam ablaufen. Ich habe mit den lokalen Datenbankadministratoren gesprochen und in vielen Fällen behaupten sie, dass die Leistung aufgrund der Art der Abfrage nicht verbessert werden kann.
Allerdings zögere ich, sie beim Wort zu nehmen. Welche Ressourcen kann ich verwenden, um zu lernen, wann ich es saugen muss und einen anderen Weg finde, die Informationen zu erhalten, die ich möchte oder mit der Geschwindigkeit lernen möchte, und wenn ich Bullshit über die DBAs aufrufen kann.
Sie befinden sich an einem interessanten Punkt. Die meisten Java-Entwickler verwenden ORM-Werkzeuge, weil sie nichts über Datenbanken wissen, sie wollen nichts über Datenbanken lernen und vor allem wollen sie nichts über die Besonderheiten eines bestimmten proprietären DBMS lernen. ORMs schützen uns anscheinend vor all dem.
Aber wenn Sie wirklich verstehen möchten, wie eine Abfrage funktionieren soll, müssen Sie verstehen, wie die Oracle-Datenbank funktioniert. Das ist eine gute Sache: Sie werden auf jeden Fall bessere Hibernate-Apps erstellen, wenn Sie mit der Struktur der Datenbank arbeiten.
Das Dokumentationspaket von Oracle enthält einen Datenträger zur Leistungsoptimierung. Dies ist der Ort, um zu beginnen. Erfahren Sie mehr . Wie andere bereits gesagt haben, ist das Einstiegswerkzeug EXPLAIN PLAN . Eine weitere wichtige Lektüre ist Oracles Database Concepts Guide . Ein wichtiger Aspekt des Tunings ist das Verstehen der logischen und physischen Architektur der Datenbank. Ich stimme auch DCookes Empfehlung von Tom Kytes Buch zu.
Denken Sie daran, dass es Auftragnehmer und Berater gibt, die das Performance-Tuning von Oracle sehr gut leben. Wenn es einfach wäre, wären sie viel ärmer. Aber Sie können sich sicherlich genug Wissen aneignen, um diese lästigen DBAs dazu zu zwingen, sich mit Ihnen richtig zu beschäftigen.
DCookie, OMG und APC erhalten alle +1 für ihre Antworten. Ich war auf der DBA-Seite von Hibernate-Apps und wie Tom Kyte es ausdrückt, gibt es keinen "fast = true" -Parameter, der ineffizientes SQL benötigt und es schneller laufen lässt. Hin und wieder konnte ich eine problematische Hibernate-Abfrage erfassen und mit dem Oracle SQL-Analyzer ein SQL-Profil für diese Anweisung generieren, das die Leistung verbessert. Dieses Profil besteht aus einer Reihe von Hinweisen, die die Erstellung eines Ausführungsplans durch den Optimierer "abfangen" und ihn (ohne Änderung der Anwendung) zu einem besseren erzwingen, der normalerweise aus irgendeinem Grund vom Optimierer übersehen würde. Dennoch sind diese Ergebnisse eher die Ausnahme als die Regel für schlechtes SQL.
Eine Sache, die Sie als Entwickler tun können, der die Daten vermutlich besser versteht als die ORM-Schicht, besteht darin, effiziente Sichten zu schreiben, um bestimmte Abfrageprobleme zu lösen und diese Ansichten in Hibernate darzustellen.
Ein sehr spezifisches Problem, auf das Sie achten sollten, sind Oracle DATE (nicht TIMESTAMP) Spalten, die in den Hibernate-generierten Abfragen enden und mit Bind-Variablen in einer WHERE-Klausel verglichen werden - der Typkonflikt mit Java-Zeitstempeldatentypen verhindert das Verwendung von Indizes für diese Spalten.
Was ist die Grundlage für Ihre Abfrageperformance-Erwartungen? Bauchgefühl? Wenn Sie mit den DBA's streiten wollen, müssen Sie zumindest wissen, was Ihre Anfragen sind, EXPLAIN PLAN verstehen und darauf hinweisen, wie Sie Dinge verbessern können. Und, wie @OMG Ponies darauf hinweist, macht Hibernate vielleicht eine schlechte Arbeit beim Erstellen von Abfragen - was machst du dann?
Nicht einfach? Vielleicht wäre ein besserer Ansatz, mit den DBA-Mitarbeitern ein bisschen weniger feindselige Herangehensweise zu nehmen und höflich zu fragen, was die Abfragen sind, die Leistungsverbesserungen hemmen, und ob es irgendwelche Vorschläge dafür gibt, wie man sie besser umgestalten kann.
Veröffentlichen Sie meinen Kommentar als Antwort:
Das ist die Abwägung bei der Verwendung eines ORM - es ist die Gnade, wie es die Abfrage konstruiert, die an die Datenbank geliefert wird. LINQ ist der einzige, der mich interessiert, weil Sie ihn für Situationen wie diese zusammen mit gespeicherten Prozeduren verwenden können. Ich bin überrascht, dass die DBAs Ihnen nicht sagen, dass Sie ORM abziehen sollten, wenn Sie eine bessere Geschwindigkeit wünschen ...
Der EXPLAIN-Plan wird Ihnen eine Vorstellung von der Effizienz geben, aber nicht wirklich eine Perspektive auf die Geschwindigkeit. Für Oracle müssten Sie tkprof
verwenden (vorausgesetzt, dass es für Sie verfügbar ist), um zu analysieren, was vor sich geht.
Tags und Links database oracle hibernate performance