Основное обновление после пары дней отладки:
Я запускаю несколько запросов, похожих на:
SELECT RTRIM(part) as part
FROM tableP pm
LEFT join tableS s on pm.id = s.id
INNER JOIN tableC cm ON cm.id = pm.id
WHERE name = 'NGW' AND status NOT IN ('NL', 'Z')
GROUP BY RTRIM(part), isnull(s.value,0)
ORDER BY isnull(s.value,0)
Он запускается на Java следующим образом:
PreparedStatement select = con.prepareStatement(
"SELECT RTRIM(part) as part" +
"FROM tableP pm " +
"LEFT JOIN tableS s ON pm.id= s.id " +
"INNER JOIN tableC cm ON cm.id= pm.id " +
"WHERE name =? AND status NOT IN ('NL', 'Z') " +
"GROUP BY RTRIM(part), isnull(s.value,0) " +
"ORDER BY isnull(s.value,0) " );
select.setString(1, name);
ResultSet rs = select.executeQuery();
while(rs.next()){
... Data is Loaded...
Запросы выполнялись нормально внутри Java-приложения. Внезапно 3 или 4 запроса этой формы превратились из менее чем в секунду в более чем минуту.
Я скопировал точный запрос из SQL Profiler, и при запуске непосредственно в базе данных он преформируется менее чем за секунду. Я начал вносить изменения в запрос и обнаружил, что любое изменение в запросе вернет его к производительности в 1 секунду , даже добавляя один пробел между оператором. Но как только я верну его в исходное точное состояние, это займет 60 с лишним секунд.
Основной вопрос:
Итак, у меня есть исправление, но что может привести к тому, что запрос будет выполняться по-другому, даже если изменение будет таким маленьким, как пробел?