Почему SQL Server останавливается после того, как некоторые строки были возвращены во время оператора select? - PullRequest
1 голос
/ 10 марта 2010

У меня есть простая процедура, которая выбирает 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. Что мне делать?

Ответы [ 2 ]

0 голосов
/ 11 марта 2010

Вполне вероятно, "параметр sniffin" g и неоптимальный кэшированный план для ошибочного значения @LastID Попробуйте это:

DECLARE @ILastID bigint
SET @ILastID = @LastID

select top (@Amount) *
from DomainName with(readuncommitted)
where LastUpdated > @LastFetchDate and ID > @ILastID and ContainsAdultWords is not null
order by ID

Другой вариант:

Что sysprocesses говорят как LastWaittype? ASYNCH_NETWORK_IO ? Если это так, то клиент не может справиться с выводом SQL Server

0 голосов
/ 10 марта 2010

Вы пытались перестроить индексы на DomainName?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...