Impossible de continuer l'analyse avec NOLOCK en raison du mouvement des données


10

Nous exécutons SQL Server 2000 et nous obtenons quelques-unes de ces erreurs chaque nuit.

Could not continue scan with NOLOCK due to data movement

La requête qui renvoie cette erreur est une grande requête complexe qui joint plus d'une douzaine de tables. Nos données sous-jacentes peuvent être mises à jour fréquemment.

La «meilleure pratique» culturelle est que, dans le passé, l'introduction d' NOLOCKindices augmentait les performances et améliorait la concurrence. Cette requête n'a pas besoin d'être précise à 100%, c'est-à-dire que nous tolérerons les lectures sales, etc. Cependant, nous avons du mal à comprendre pourquoi la base de données génère cette erreur, même si nous avons toutes ces astuces de verrouillage.

Quelqu'un peut-il éclairer cela - soyez doux, je suis en fait un programmeur, pas un DBA :)

PS: nous avons appliqué le correctif mentionné ci-dessous précédemment: http://support.microsoft.com/kb/815008


3
Je laisserais tomber le NOLOCK et corrigerais la requête / index / processus. Nous pouvons bien sûr vous aider ... Voir aussi en.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi: SQL 2012 récupère gracieusement dans de nombreux cas de mouvement de données sous des analyses sales (continue à la page suivante dans l'ordre d'allocation).
Remus Rusanu

1
@SQLKiwi: oui, il y en a encore. Sur la bonne nouvelle: les curseurs soutenus par des analyses sales devraient également gérer cela plus gracieusement.
Remus Rusanu

Réponses:


7

Il s'agit d'un problème raisonnablement bien connu avec SQL Server 2000 - essentiellement, ce qui se passe est si une ligne est supprimée par le processus A pendant que le processus B effectue une analyse (soit à READ UNCOMMITTEDou WITH (NOLOCK)), alors le processus B va "hein ce qui est arrivé à ces données "quand il essaie de le lire. Plus précisément, la ligne doit être supprimée après que le processus B a lu l'index, mais avant de tenter de lire la ligne de données.

Craig Freedman donne une bonne écriture ici

Heureusement, le correctif est relativement simple: http://support.microsoft.com/kb/815008

Si cela ne fonctionne pas, vous avez l'option légèrement plus douloureuse de supprimer tous vos WITH (NOLOCK)conseils et de définir votre niveau d'isolement des transactions à quelque chose au-dessus READ UNCOMMITTED.


Nous sommes à jour avec ce correctif - nous avons appliqué le drapeau, redémarré et nous obtenons toujours ces erreurs.
Ciaran Archer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.