Leistungsprobleme mit JDBC

9

Ich bin derzeit mit einem Problem konfrontiert, bei dem eine bestimmte SQL-Abfrage innerhalb einer Java-Anwendung etwa 30 Sekunden dauert, aber in einem SQL-Client (SQL Developer) & lt; 1 sec.

In der Frage, Verlangsamen Abfrage in Java von JDBC, aber nicht in anderen Systemen (TOAD) , es wird vorgeschlagen, dass die Verwendung einer PreparedStatement gebunden an Java-Variablen könnte die Abfrage viel langsamer als im SQL-Client (TOAD in diesem ausführen Fall), weil Oracle verwirrt wird, welche Indizes verwendet werden sollen. Könnte das ein Problem mit einem PreparedStatement auch ohne Parameter sein?

Was könnte sonst das Problem sein?

Die Abfrage sieht ungefähr wie

aus %Vor%

Dabei ist Ansicht_ eine komplexe Ansicht mit Aggregationen von Tabellen und anderen komplexen Ansichten. Die Abfrage wird als PreparedStatement, aber ohne Parameter ausgeführt. Es scheint keinen Unterschied zu machen, ob wir vorbereitete Aussagen oder nur einfache Aussagen verwenden.

Da der Ausführungsplan ziemlich groß ist, kann ich nicht alles hier posten, aber der relevante Unterschied scheint zu sein:

%Vor% %Vor%

Woher das erste Snippet kommt, wenn es mit dem JDBC Thin Client ausgeführt wird, und das zweite, wenn es in SQL Developer ausgeführt wird. Es nimmt nicht den korrekten Index auf, wenn es als Anweisung ausgeführt wird (es macht keinen Unterschied, ob ich eine vorbereitete Anweisung verwende oder nicht) mit dem JDBC Thin Client. Der Zeitunterschied beträgt 30 Sekunden für den ersten und 0,5 Sekunden für den zweiten.

Könnte es sein, dass die Verwendung der Funktion get_time_id die Verwendung des Index bei der Verwendung durch JDBC verbietet, obwohl sie nicht für die Spalte funktioniert und obwohl sie in SQL Developer zu funktionieren scheint?

    
Sebastian Ganslandt 02.11.2010, 14:35
quelle

3 Antworten

2

Ich würde versuchen, eine Ablaufverfolgung in der Datenbank auszuführen, während ich die Anwendung verwende.

Dann sollten Sie in der Lage sein, die laufende Abfrage und den tatsächlichen Ausführungsplan zu sehen. Dies zeigt Ihnen genau, was gerade passiert, dh ob es die Indizes aufnimmt oder nicht.

    
LauraB 04.10.2011 13:14
quelle
1

Es ist sehr wahrscheinlich, dass Sie aufgrund der Prädikate, die übergeben werden, Probleme mit der Peakanhebung von Bind haben. Versuchen Sie, die Abfrage mit folgenden Angaben auszuführen, um zu bestätigen (d. h. konsistente Laufzeiten):

%Vor%

Sind die Statistiken auf allen Objekten aktuell?

Wie justin auch geschrieben hat, stellen Sie sicher, dass Sie auch richtig messen. Ohne die vollständige Abfrage wird es schwierig sein, zusätzliche Erkenntnisse bereitzustellen.

    
erbsock 02.11.2010 14:57
quelle
0

Überprüfen Sie, ob jemand die Eigenschaft oracle.jdbc.defaultNChar = true

nicht festgelegt hat

Dies wird manchmal gemacht, um Unicode-Probleme aufzulösen, aber es bedeutet, dass alle Spalten als nvarchars behandelt werden. Wenn Sie einen Index für eine varchar-Spalte haben, wird dieser nicht verwendet, da oracle eine Funktion zum Konvertieren der Zeichencodierung verwenden muss.

    
nevster 18.10.2013 05:29
quelle

Tags und Links