Não foi possível continuar a verificação com NOLOCK devido à movimentação de dados

10

Executamos o SQL Server 2000 e obtemos alguns desses erros todas as noites.

Could not continue scan with NOLOCK due to data movement

A consulta que gera esse erro é uma consulta complexa grande que une mais de uma dúzia de tabelas. Nossos dados subjacentes podem ser atualizados com freqüência.

A 'melhor prática' cultural é que, no passado, a introdução de NOLOCKdicas aumentava o desempenho e melhorava a simultaneidade. Essa consulta não precisa ser 100% precisa, ou seja, toleraremos leituras sujas etc. No entanto, estamos lutando para entender por que o banco de dados está lançando esse erro, mesmo que tenhamos todas essas dicas de bloqueio.

Alguém pode lançar alguma luz sobre isso - seja gentil, sou na verdade um programador, não um DBA :)

PS: aplicamos a correção mencionada abaixo anteriormente: http://support.microsoft.com/kb/815008

Arqueiro Ciaran
fonte
3
Eu soltaria o NOLOCK e corrigiria a consulta / índices / processo. Podemos ajudar, é claro ... Veja também en.wikipedia.org/wiki/Halloween_Problem
gbn
3
@SQLKiwi: O SQL 2012 se recupera normalmente em muitos casos de movimentação de dados sob varreduras sujas (continua na próxima página na ordem de alocação).
Remus Rusanu
11
@ SQLKiwi: sim, ainda existem. Nas boas notícias: também os cursores apoiados por verificações sujas devem lidar com isso de maneira mais elegante.
Remus Rusanu

Respostas:

7

Esse é um problema razoavelmente conhecido no SQL Server 2000 - essencialmente, o que acontece é que uma linha é excluída pelo processo A enquanto o processo B está fazendo uma verificação (no READ UNCOMMITTEDou WITH (NOLOCK)), então o processo B fica "huh, o que aconteceu com esses dados "quando tenta ler. Mais precisamente, a linha deve ser excluída após o processo B ler o índice, mas antes de tentar ler a linha de dados.

Craig Freedman escreve bem aqui

Felizmente, a correção é relativamente simples: http://support.microsoft.com/kb/815008

Se isso não funcionar, você tem a opção um pouco mais dolorosa de remover todas as suas WITH (NOLOCK)dicas e definir o nível de isolamento da transação para algo acima READ UNCOMMITTED.

Simon Righarts
fonte
Estamos atualizados com essa correção - aplicamos o sinalizador, reiniciamos e ainda temos esses erros.
Ciaran Archer