4

У меня есть запрос, запущенный из приложения Delphi, которое внезапно начало отсчеты на прошлой неделе после безупречного функционирования в течение нескольких месяцев. еще более, когда он работает он замедляет сервер ползти оставляя другие пользователи полагают, что система имеет сбой Запуск от Management Studio, я остановить запрос после более 5 минут спиннинг SERVER SqlExpress ID 2008 R2Запрос, который работал в течение нескольких месяцев, теперь отключен

Ныне задеть запрос

SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 365)) 

Чтобы сделать его интересным здесь является время, необходимое & строки вернуться, когда я просто изменить количество дней назад. Мониторинг активности не показывает больше, чем выполняется запрос

SELECT  * 
FROM  SignelOutilsListeJobs_View4 -- 00.00.02 38882 ROWS 

SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 600)) -- 00.00.02 16217 ROWS 


SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 500)) -- 00.00.02 13013 ROWS 


SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 200)) -- 00.00.12 4118 ROWS 

Так что мне осталось интересно, что здесь происходит? Есть идеи?

Благодаря

+0

Первое предположение: плохой план запроса получил кэшируются для этого запроса. –

+0

... почему бы не просто предварительно вычислить предел даты в вашем коде Delphi, а затем передать его как параметр запроса? Он может быть менее подвержен ошибкам, позволяет легко повторно использовать один и тот же оператор с различными смещениями, а также совместим со всеми бэкэндами БД ... –

+1

Не ответ на вызов производительности, но вы должны использовать DATEADD вместо математического ярлыка. Понятно, что вы делаете и не полагаетесь на поведение по умолчанию, которое может измениться. DATEADD (день, -200, getdate()) –

ответ

1

От GETDATE (Transact-SQL):

Использование SWITCHOFFSET с функцией GETDATE() может вызвать запрос, чтобы работать медленно, потому что оптимизатор запросов не может получить точные оценки мощности для значения GetDate. Мы рекомендуем предварительно скопировать значение GETDATE и затем указать это значение в запросе, как показано в следующем примере. Кроме того, используйте подсказку запроса OPTION (RECOMPILE), чтобы заставить оптимизатор запросов перекомпилировать план запроса в следующий раз, когда выполняется тот же запрос. Затем оптимизатор будет иметь точные оценки мощности для GETDATE() и создаст более эффективный план запроса.

Другими словами, вы можете попытаться изменить запрос следующим образом:

SELECT * 
FROM SignelOutilsListeJobs_View4 
WHERE CreatedDate > (GETDATE() - 200) OPTION (RECOMPILE) 

В качестве альтернативы выше, вы можете рассмотреть, чтобы создать уникальный кластерный индекс на представлении :

CREATE UNIQUE CLUSTERED INDEX SignelOutilsListeJobs_unique_index1 
ON SignelOutilsListeJobs_View4 (CreatedDate, <some unique key>) 

Из Microsoft TechNet:

+0

Я попытался следующие три версии запроса приводит к тому же результату, обратите внимание, что я перестану запрос выждав минуту, прежде чем пользователи стучать в мою дверь - SELECT * FROM SignelOutilsListeJobs_View4 WHERE (CreatedDate> (GETDATE () - 365)) ВАРИАНТ (RECOMPILE) - SELECT * ОТ SignelOutilsListeJobs_View4 ГДЕ (CreatedDate> DateAdd (день, -365, GETDATE())) ВАРИАНТ (RECOMPILE) - объявить дату ADATE -AT СИМ демонтируемых для POST SET ADATE = GETDATE() - 365 SELECT * FROM SignelOutilsLi steJobs_View4 WHERE (CreatedDate> @ADATE) OPTION (RECOMPILE) – Marc