我有这个SQL请求:
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;
在PGAdmin上,在不到1秒的时间内返回大约15000行。 当我使用Spring JDBC在我的Java应用程序中执行它时,有时需要不到1秒,但有时需要更多(> 1分钟)。 请求在超过1分钟内有大约50%的可能性挂起。 当它发生时,我可以在PGAdmin服务器状态选项卡上看到请求仍在执行。
它没有被其他交易阻止。我试图增加JDBC的fetchSize。我试图用LIMIT和OFFSET对请求进行分页,每次只返回1000行。无论有没有准备好的声明我都试过了 我还尝试在JUnit测试中执行请求,重复100次,这没问题。
仅在应用程序上发生,该应用程序是一个批处理应用程序,其中多个线程(Executor)按特定顺序依次运行,在数据库中执行操作。我怀疑这个多线程环境涉及到问题的原因。
答案 0 :(得分:1)
我终于解决了这个问题。请求的计划在第1次和第2次请求之间是不一样的。 执行真空分析可以解决问题。所以这是一个纯粹的PostgreSQL问题。