Что может вызвать GetDate (), чтобы вызвать тайм-ауты? - PullRequest
3 голосов
/ 22 ноября 2011

Каждые несколько месяцев несколько избранных страниц сайта начинают отвечать

Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.

Я запустил SQL Server Profiler, чтобы увидеть, где зависает база данных. Это по определенной хранимой процедуре. Поэтому я взял вызов хранимой процедуры и провел его через Management Studio. Возвращает несколько тысяч строк за секунду.

Открывая процедуру, я вижу, что это просто выражение выбора. Если я возьму оператор select и запустю его в новом окне запроса, Management Studio зависнет.

Итак, я запускаю его по частям и нахожу строку, из-за которой запрос зависает

and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate) 

GetDate() в любом случае должен быть @CurrentDate, поэтому, если я его переключу, он будет работать нормально. Почему это даже имеет значение, хотя? Как я понимаю, GetDate не должен быть дорогим звонком. Я понимаю, что IsNull есть, но это тоже не должно иметь значения, так как он прекрасно справится с запросом, если я просто поменяю GetDate на CurrentDate.

Правильно ли я считаю, что getdate вызывает прерывание этого запроса? Как / почему он это сделал?

Немного предыстории, как я уже говорил, эта ошибка появлялась раньше, 23 марта, 27 июля, 25 октября, а теперь и 21 ноября. Кажется, что это всегда случается ближе к концу месяца. Я был уверен, что в это время ничего не происходит (запланированные задания, обслуживание и т. Д.)

Это на рабочем сервере, поэтому я не смог потратить время на устранение проблемы. Как только сайт выходит из строя, он должен быть восстановлен. Я знаю, как это исправить, мне просто нужно перекомпилировать хранимую процедуру, но кто-нибудь знает, что может быть причиной этого?

SQL Server также имеет другую базу данных UAT, та же процедура будет зависать и для этой базы данных. Но другие хранимые процедуры с одинаковой строкой кода нормально работают в обеих базах данных.

Редактировать: мне пришлось восстановить веб-сайт, поэтому я перекомпилировал хранимую процедуру. Сайт теперь работает нормально. Однако запрос все еще не выполняется сам по себе.

1 Ответ

0 голосов
/ 22 ноября 2011

Я ошибся в причине проблемы. Запрос, который я выполнял по частям, был в основном:

select *
from Item
left outer join category Subcategories on Subcategories.ItemKey = Item.Id,
Categories Category,
Availability
where Item.Id = @ItemId
  and GetDate() between Availability.EffectiveDate 
      and ISNULL(Availability.ExpiryDate, @CurrentDate) 

Очевидно, что это не запрос, выполняемый в рабочей среде, а просто анонимный пример.

Этот запрос не будет запущен. Чтобы запустить его, я закомментировал

and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate)

Он также запустился бы, если бы я изменил GetDate() на @CurrentDate. Я был уверен, что GetDate была проблема. Однако, когда я запустил запрос и прокомментировал строку Availablity, она работала нормально. Availability массивный стол. Я запустил переиндексацию и обновление статистики, и все работает отлично. Думаю, я должен GetDate извиниться.

Редактировать: Это произошло снова в совершенно другой среде. Снова GetDate, кажется, был виновником. Изменение этой строки и запуск процедуры заставили все снова работать. GetDate не может быть виновата в качестве основной причины, но это определенно первый признак того, что что-то идет не так.

...