Efeito da dica NOLOCK em instruções SELECT

Eu acho que a verdadeira questão é:

Se eu não me importo com leituras sujas, adicionar a dica com (NOLOCK) a uma instrução SELECT afeta o desempenho de:

  1. a instrução SELECT atual
  2. outras transactions contra a tabela dada

Exemplo:

Select * from aTable with (NOLOCK) 

1) Sim , uma seleção com NOLOCK será concluída mais rapidamente que uma seleção normal.

2) Sim , uma seleção com NOLOCK permitirá que outras consultas na tabela afetada sejam concluídas mais rapidamente que uma seleção normal.

Por que isso seria?

NOLOCK normalmente (dependendo do seu mecanismo de database) significa me fornecer seus dados, e eu não me importo com o estado em que se encontra, e não se incomode em mantê-lo parado enquanto você lê a partir dele. É tudo de uma vez mais rápido, menos intensivo em resources e muito, muito perigoso.

Você deve ser avisado para nunca fazer uma atualização ou executar qualquer coisa crítica ao sistema, ou quando a correção absoluta é necessária usando dados originados de uma leitura NOLOCK . É absolutamente possível que esses dados contenham linhas que foram excluídas durante a execução da consulta ou que tenham sido excluídas em outras sessões que ainda precisam ser finalizadas. É possível que esses dados incluam linhas que foram atualizadas parcialmente. É possível que esses dados contenham registros que violem as restrições de chave estrangeira. É possível que esses dados excluam linhas que foram adicionadas à tabela, mas que ainda precisam ser confirmadas.

Você realmente não tem como saber qual é o estado dos dados.

Se você estiver tentando obter coisas como uma Contagem de Linhas ou outros dados de resumo em que uma margem de erro seja aceitável, o NOLOCK é uma boa maneira de aumentar o desempenho dessas consultas e evitar que elas tenham um impacto negativo no desempenho do database.

Sempre use a dica NOLOCK com muita caucanvas e trate todos os dados retornados com suspeita.

O NOLOCK torna a maioria das instruções SELECT mais rápidas, devido à falta de bloqueios compartilhados. Além disso, a falta de emissão dos bloqueios significa que os escritores não serão impedidos pelo seu SELECT.

NOLOCK é funcionalmente equivalente a um nível de isolamento de READ UNCOMMITTED. A principal diferença é que você pode usar NOLOCK em algumas tabelas, mas não em outras, se quiser. Se você planeja usar NOLOCK em todas as tabelas em uma consulta complexa, usar o NÍVEL DE ISOLAÇÃO DE TRANSACTION SET LEIT UNCOMMITTED é mais fácil, porque você não precisa aplicar a dica a todas as tabelas.

Aqui estão informações sobre todos os níveis de isolamento à sua disposição, bem como sugestões de tabelas.

AJUSTE O NÍVEL DE ISOLAMENTO DA TRANSAÇÃO

Dica de Tabela (Transact-SQL)

Além do que foi dito acima, você deve estar ciente de que o nolock na verdade impõe o risco de você não obter as linhas que foram confirmadas antes da sua seleção.

Consulte http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

Será mais rápido porque não precisa esperar por bloqueios

  • O SELECT atual começará antes, porque não precisa esperar.

  • As outras transactions diminuirão, pois agora elas estão compartilhando seu tempo de processamento com uma nova transação.

Não use isso.

O NOLOCK é frequentemente explorado como uma maneira mágica de acelerar as leituras do database, mas eu tento evitar usá-lo da forma mais possível.

O conjunto de resultados pode conter linhas que ainda não foram confirmadas, que geralmente são revertidas posteriormente.

Um erro ou conjunto de resultados pode estar vazio, faltando linhas ou exibir a mesma linha várias vezes.

Isso ocorre porque outras transactions estão movendo dados ao mesmo tempo que você está lendo.

READ COMMITTED adiciona um problema adicional onde os dados são corrompidos em uma única coluna, onde vários usuários alteram a mesma célula simultaneamente.

Existem outros efeitos colaterais também, que resultam em sacrificar o aumento de velocidade que você esperava ganhar em primeiro lugar.

Agora você sabe, nunca use de novo.