J'ai un processus avec un Select qui prend beaucoup de temps à se terminer, de l'ordre de 5 à 10 minutes.
Je n'utilise actuellement pas NOLOCK comme indice pour le moteur de base de données MS SQL.
En même temps, nous avons un autre processus effectuant des mises à jour et des insertions dans la même base de données et les mêmes tables.
Le premier processus a commencé, récemment pour se terminer prématurément avec un message
SQLEXCEPTION: La transaction a été bloquée sur les ressources de verrouillage avec un autre processus et a été choisie comme victime du blocage.
Ce premier processus s'exécute sur d'autres sites dans des conditions identiques mais avec des bases de données plus petites et donc l'instruction de sélection en question prend un laps de temps beaucoup plus court (de l'ordre de 30 secondes environ). Dans ces autres sites, je ne reçois pas le message de blocage dans ces autres sites. Je n'ai pas non plus reçu ce message sur le site qui rencontre le problème au départ, mais, je suppose, à mesure que la base de données s'est agrandie, je pense que j'ai dû franchir un certain seuil. Voici mes questions:
- Le temps nécessaire à l'exécution d'une transaction pourrait-il rendre le processus associé plus susceptible d'être signalé comme victime d'un blocage.
- Si j'exécute la sélection avec un indice NOLOCK, est-ce que cela résoudra le problème?
- Je soupçonne qu'un champ datetime qui est vérifié dans le cadre de la clause WHERE dans l'instruction select provoque le temps de recherche lent. Puis-je créer un index basé sur ce champ? Est-ce conseillé?
la source
Réponses:
Non. Le SELECT est la victime car il n'avait lu que des données, donc la transaction a un coût moins élevé qui lui est associé, elle est donc choisie comme victime:
Non, pour plusieurs raisons:
Probablement. La cause de l'impasse est presque très probablement une base de données mal indexée. Les requêtes de 10 minutes sont acceptables dans des conditions si restreintes, que je suis sûr à 100% dans votre cas n'est pas acceptable.
Avec une confiance de 99%, je déclare que votre impasse est bloquée par une analyse de table volumineuse en conflit avec les mises à jour. Commencez par capturer le graphique de blocage pour analyser la cause. Vous devrez très probablement optimiser le schéma de votre base de données. Avant d'effectuer toute modification, lisez cette rubrique Conception d'index et les sous-articles.
la source
Voici comment ce problème particulier de blocage s'est réellement produit et comment il a été résolu. Il s'agit d'une base de données assez active avec 130K transactions effectuées quotidiennement. Les index des tables de cette base de données étaient à l'origine groupés. Le client nous a demandé de rendre les index non clusterisés. Dès que nous l'avons fait, l'impasse a commencé. Lorsque nous avons rétabli les index en cluster, le blocage s'est arrêté.
la source
Les réponses ici valent la peine d'être essayées, mais vous devriez également revoir votre code. Plus précisément, lisez la réponse de Polyfun ici: Comment se débarrasser de l'impasse dans une application SQL Server 2005 et C #?
Il explique le problème de la concurrence, et comment l'utilisation de "with (updlock)" dans vos requêtes peut corriger votre situation de blocage - en fonction vraiment de ce que fait exactement votre code. Si votre code suit ce modèle, c'est probablement une meilleure solution à apporter, avant de recourir à des lectures sales, etc.
la source
Bien que @ Remus Rusanu 's soit déjà une excellente réponse, au cas où l'on espère mieux comprendre les causes des blocages de SQL Server et les stratégies de traçage, je vous suggère de lire How to Track Down Deadlocks Using SQL Server 2005 Profiler de Brad McGehee .
la source