Ich habe diese SQL-Anfrage:Frühling JDBCTemplate + Postgres, ist die gleiche Anfrage sehr langsam
SELECT num.top, num.top/1.0E7 as value, num.grille_id, 13 as resultat_id FROM (
SELECT SUM(c.top + a.top2 * 900) as top, a.grille_id FROM exe_resultat a
INNER JOIN exe_resultat_2 c ON c.resultat_id=11 AND c.grille_id = a.grille_id
WHERE a.resultat_id =13 GROUP BY a.grille_id
UNION ALL
SELECT a.top2 * 900 as top, a.grille_id FROM exe_resultat a
LEFT JOIN exe_resultat_2 c ON c. resultat_id=11 AND c.grille_id = a.grille_id
WHERE a.resultat_id =13 AND c.grille_id IS NULL
UNION ALL
SELECT c.top, c.grille_id FROM exe_resultat_2 c
LEFT JOIN exe_resultat a ON a. resultat_id=13 AND a.grille_id = c.grille_id
WHERE c.resultat_id =11 AND a.grille_id IS NULL) num ORDER BY num.grille_id;
Es gibt etwa 15.000 Zeilen in weniger als 1 Sekunde auf PGAdmin. Wenn ich es in meiner Java-Anwendung mit Spring JDBC ausführe, dauert es manchmal weniger als 1 Sekunde, aber manchmal dauert es viel länger (> 1 Minute). Es besteht eine Wahrscheinlichkeit von 50%, dass die Anforderung länger als 1 Minute anhält. Wenn es passiert, kann ich auf der PGAdmin Server Status Registerkarte sehen, dass die Anfrage noch ausgeführt wird.
Es ist nicht durch eine andere Transaktion blockiert. Ich habe versucht, fetchSize von JDBC zu erhöhen. Ich habe versucht, die Anfrage mit LIMIT und OFFSET zu paginieren, um jedes Mal nur 1000 Zeilen zurückzugeben. Ich habe es mit oder ohne Vorbereitung versucht. Ich habe auch versucht, die Anfrage in einem JUnit-Test lopping 100 Mal auszuführen und es war in Ordnung.
Es tritt nur auf der Anwendung, die eine Batch-Anwendung mit mehreren Thread (Executor) sequenziell in einer bestimmten Reihenfolge ausgeführt wird Operation in der Datenbank ausgeführt wird. Ich vermute, dass diese Multithread-Umgebung in die Ursache des Problems involviert ist.
Was machen Sie Java-Code mit den Ergebnissen? Sind Sie sicher, dass dies kein Problem bei der Verarbeitung der Ergebnisse ist? Sie können Ihre Anwendung mit Profiler ausführen, und wenn dieses Problem auftritt, überprüfen Sie, ob das Problem wirklich in Datenbankaufrufen und nicht in Ihrer Verarbeitung liegt. –