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?