Операторы SELECT могут блокировать другой оператор SELECT. Вы, вероятно, думаете, что, поскольку оба приобретают только S-блокировки, они никогда не должны блокироваться. Но блокировка происходит на различных типах ресурсов, а не только на блокировках. Типичным примером являются ограничения памяти. Я попытаюсь найти недавний ответ на вопрос, который здесь содержит график взаимоблокировок, который показывает операторы SELECT, один ожидает другого для ресурсов памяти параллельного оператора обмена (буферов).
Обновлено
Вот ссылка с информацией о взаимоблокировках, о которой я говорил: У меня есть данные о взаимоблокировках, но я не могу понять, почему они возникают
Если вы изучите график взаимоблокировки, вы увидите следующий ресурс в списке ожидания:
<exchangeEvent id="Pipe894b0680" WaitType="e_waitPipeGetRow" nodeId="0">
<owner-list>
<owner id="process824df048"/>
</owner-list>
<waiter-list>
<waiter id="process86ce0988"/>
</waiter-list>
</exchangeEvent>
Это не блокировка, это ресурс 'e_waitPipeGetRow', принадлежит SELECT, и другой SELECT ожидает его. Некоторая дискуссия о «параллельных ресурсах внутри запроса» может быть найдена здесь: Сегодняшний раздражающий и громоздкий термин: «взаимные блокировки параллельных потоков внутри запроса» . Хотя большинство обсуждений будет сосредоточено на вопросах взаимоблокировки, это не означает, что обычная блокировка не может происходить на этих ресурсах. sys.dm_exec_requests
будет иметь правильную информацию в wait_type
и wait_resource
.