У меня довольно простой SQL-запрос (SQL Server 2016).Я извлекаю около 15 столбцов из нескольких простых внутренних и левых объединений в 8 таблицах, у которых все имеют WITH (NOLOCK)
в объединении.Мое предложение where проверяет несколько строковых, уникальных идентификаторов и битовых значений.Хранимая процедура не имеет никаких вычислений, никаких циклов / курсоров / операторов case и т. Д. Это очень просто.
По какой-то причине наше приложение периодически зависает из-за истечения времени ожидания вызова SQL.Когда я перехватываю вызов в профилировщике и запускаю его в SSMS, он запускается менее чем за секунду, но из приложения он просто не завершается.
Однако, если я запишу команду ALTER в запросе и просто добавлюпустая строка и выполнить изменение, проблема исчезнет, и вызовы будут выполняться мгновенно.Внесенные мною изменения не являются чем-то существенным, просто изменение запроса каким-то образом, кажется, разблокирует его.
Кто-нибудь знает, что может быть причиной этого?Я не вижу никаких замков, когда время истекает.Я думал, может быть, плохой план выполнения кэшируется?
Единственная другая странность заключается в том, что это выполняется из старого унаследованного приложения, нашего последнего в старой классической Asp.Но это не похоже на веб-сервер или архитектуру, а только на базу данных.