Enquanto seguia " Quanto fica offline durante uma reconstrução de índice? " de BrentOzar, fiquei curioso para executar:
SELECT Quantity FROM [Production].[TransactionHistory] WITH(NOLOCK)
ao executar uma reconstrução do artigo mencionado e observe que está sendo atrasado até que a reconstrução do índice seja concluída
O que é bloqueio SELECT ... WITH(NO LOCK)
e como evitá-lo?
Atualização:
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
Enterprise Evaluation Edition (64 bits) no Windows NT 6.1 (Build 7601: Service Pack 1)
Se a reconstrução não for especificada como
ONLINE
(o que você não pode fazer exceto no Enterprise Edition), oSELECT
é bloqueado por causa deLCK_M_SCH_S
, e se você executarsp_lock
, verá que é um bloqueio exclusivo. MesmoNOLOCK
não pode penetrar nisso. Você pode simular isso por:Em uma janela, inicie uma transação que reconstrói offline (isso é para que você possa investigar além da reconstrução em vez de tentar forçar uma reconstrução realmente longa). Anote o spid:
Em uma segunda janela, execute sua
NOLOCK
consulta (novamente, anote o spid):Em uma terceira janela, verifique:
Examine o segundo conjunto de resultados para todas as linhas envolvidas com o spid que é o principal bloqueador.
Não se esqueça de reverter ou confirmar...