A maioria das instruções select em nossos procedimentos armazenados usam WITH(NOLOCK)
e meus colegas de trabalho me disseram que eles usam para melhorar o desempenho. Agora, eu sei que essa dica ajuda no bloqueio, mas na verdade melhora o desempenho? Li em algum lugar que não devemos usar as NOLOCK
dicas nos bancos de dados OLTP, mas vejo o contrário sendo feito no meu local de trabalho. Alguém poderia esclarecer as melhores práticas quando se trata de usar as NOLOCK
dicas?
relate perguntas
-
SQL Server 2012 Criar índice com Sort In TempDb On - Gains False?
-
Transparência de failover do SQL Server AlwaysOn
-
Por que as sequências Denali devem ter um desempenho melhor do que as colunas de identidade?
-
O SQL Server não deveria oferecer suporte a RANGE?
-
O que é SQL Server "Denali"? O que há de novo?
não comprometido
A dica NOLOCK é um sinônimo do nível de isolamento READ UNCOMMITTED. Por favor, considere-os equivalentes e intercambiáveis durante esta resposta. Read Uncommitted é implementado no SQL Server para obter bloqueios de esquema mínimos que impedem alterações na(s) tabela(s) que estão sendo consultadas.
O uso de qualquer um deles ainda terá bloqueios de esquema, mas eles poderão ignorar bloqueios obtidos por consultas de modificação (inserir, atualizar, excluir, mesclar) que ainda não concluíram suas tarefas e reverteram ou confirmaram a(s) transação(ões) .
Todas as consultas de leitura fora daquelas que usam dicas de bloqueio exclusivas (por exemplo, UPDLOCK) dentro de uma transação terão e liberarão rapidamente bloqueios em diferentes granularidades (linha, página, etc.) conforme escolhido pelo mecanismo de armazenamento. Não há escalonamento de bloqueio para consultas de leitura.
A diferença está em como os níveis de isolamento se comportam quando encontram linhas, páginas ou objetos bloqueados.
Em Read Committed, Repeatable Read e Serializable, a consulta de leitura é bloqueada até que as modificações liberem seus bloqueios.
Em Read Committed Snapshot Isolation e Snapshot Isolation, a consulta de leitura lerá a última versão válida conhecida das linhas bloqueadas do armazenamento de versão.
Muitas das conclusões "minha consulta ficou mais rápida com o NOLOCK" vêm (incorretamente) de evitar o bloqueio. Em Read Committed, as consultas de leitura também podem bloquear e travar com consultas de modificação em algumas circunstâncias. Ver:
Usar NOLOCK como uma dica de consulta ou Read Uncommitted como um nível de isolamento evitará esses cenários. Mais uma vez, eles são a mesma coisa.
Há uma consideração adicional, é claro, em que as consultas que especificam certas dicas de bloqueio podem usar varreduras do IAM para ler menos páginas .
Observe a diferença de aproximadamente 6 segundos na varredura de índice clusterizado para a consulta que usou NOLOCK e a consulta que usou TABLOCK como dicas.
uso
Já que você perguntou:
Do nível de isolamento de leitura não confirmada :
Para evitar os cenários de bloqueio e impasse mais irritantes e, como resultado, retornar dados corretos, o nível Read Committed Snapshot Isolation ou o nível Snapshot Isolation é sua melhor aposta.