Конкретный запрос выполняется нормально напрямую или при внесении каких-либо изменений в него, но в текущем состоянии выполнение занимает больше времени - PullRequest
2 голосов
/ 25 января 2011

Основное обновление после пары дней отладки:

Я запускаю несколько запросов, похожих на:

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 с лишним секунд.

Основной вопрос: Итак, у меня есть исправление, но что может привести к тому, что запрос будет выполняться по-другому, даже если изменение будет таким маленьким, как пробел?

1 Ответ

1 голос
/ 28 января 2011

Возможно ли, что план выполнения поврежден?Можете ли вы попробовать явно очистить кэш плана?http://msdn.microsoft.com/en-us/library/aa175244(v=sql.80).aspx

...