У меня есть простая процедура, которая выбирает 1000 строк из таблицы. Для ясности вот как выглядит хранимая процедура:
alter procedure dbo.GetDomainForIndexing
@Amount int=1,
@LastID bigint,
@LastFetchDate datetime
as
begin
select top (@Amount) *
from DomainName with(readuncommitted)
where LastUpdated > @LastFetchDate
and ID > @LastID
and ContainsAdultWords is not null
order by ID
end
У меня были проблемы, когда он выполнял эту конкретную процедуру несколько раз, с той лишь разницей, что в каждый раз передавалось другое значение @LastID
. Как только я получу конкретный идентификатор, процедура почти мгновенно вернет первые 880 строк (это происходит в Management Studio), а затем будет сидеть и буквально останавливаться в течение следующих 6 минут, прежде чем вернуть оставшиеся 120 строк. *
Что может вызвать такое поведение? Нет транзакций, связанных с соединением, и нет проблем с пулом соединений. Бит (readuncommitted) не влияет на проблему. Эта проблема возникает как внутри моего приложения, так и при копировании текста команды в SQL Management Studio для тестирования; действительно, именно там я обнаружил это странное поведение срыва. Вначале я просто пытался понять, почему эта процедура будет работать несколько раз, а затем внезапно начал останавливаться без видимой причины.
Есть идеи?
UPDATE
Эта проблема также возникает (задержка после возврата 880 строк) при запросе 883 строк, но не при запросе 882 строк.
ОБНОВЛЕНИЕ 2
Выбор из sys.sysprocesses
и sys.dm_exec_requests
означает тип последнего ожидания PAGEIOLATCH_SH
. Что мне делать?