Le blocage de SQL Server est une caractéristique normale des systèmes de base de données SQL Server. Le blocage se produit lorsque SQL Server traite les demandes de plusieurs clients et que différents processus demandent les mêmes ressources en même temps. Si une ressource est en cours d'utilisation, elle est verrouillée et indisponible pour les demandes ultérieures, de sorte que le processus est retardé jusqu'à ce que la ressource soit libérée et redevienne disponible. Les blocs SQL Server se résolvent normalement sans effet notable sur les performances. Cependant, à l'occasion, les blocs entraînent une dégradation des performances soit parce que le processus initial verrouille la ressource pendant une période prolongée avant de la libérer, soit parce que le processus initial ne libère pas du tout la ressource, ce qui rend les ressources inaccessibles jusqu'à ce que le bloc soit résolu manuellement.
Lorsqu'un ensemble de ressources est bloqué pendant une durée significative, la qualité des performances diminue au point que les utilisateurs du système commencent à remarquer des problèmes. Ces problèmes incluent des éléments tels que les requêtes qui prennent beaucoup de temps à s'exécuter ou qui expirent ou les utilisateurs qui ne peuvent pas enregistrer les écrans qu'ils ont modifiés.
Comment réparer les blocages SQL Server
La solution à court terme au blocage de SQL Server consiste à identifier et à débloquer manuellement la transaction lorsque vous remarquez que les performances sont affectées négativement par un ou plusieurs blocs.
Une fois que vous avez confirmé la présence d'un bloc SQL Server, vérifiez le moniteur d'activité SQL Server et tuez les requêtes qui causent le plus de problèmes. Vous pouvez également utiliser des scripts SQL pour surveiller en permanence l'état du verrouillage et du blocage sur SQL Server. Brent Ozar suggère d'ajouter des compteurs de performances spécifiques au blocage afin que SQL Server vous avertisse lorsque vous avez dépassé vos seuils de blocage désignés.
Comment empêcher les blocages SQL Server
Il est utile pour un administrateur de base de données de savoir comment réparer un bloc SQL Server. Mais dans l'intérêt de maintenir un système performant, il est encore mieux de savoir comment prévenir - ou du moins minimiser - l'apparition d'un blocage. Voici quatre conseils pour minimiser certains types courants de blocage SQL Server :
1. Utiliser les index
L'utilisation d'index clusterisés dans des tables très utilisées permet de réduire le blocage en invitant l'optimiseur de requête à exécuter une recherche d'index au lieu d'une analyse d'index. Lorsque seul l'enregistrement en cours de mise à jour est verrouillé, les processus suivants peuvent contourner le verrou et être terminés.
Il est également important de s'assurer que les instructions UPDATE et DELETE utilisent des index. Les index aident les instructions UPDATE et DELETE à réduire le nombre de verrous de modification qu'ils acquièrent à l'aide d'index non clusterisés ou d'indicateurs d'index pour supprimer les verrous.
2. Nettoyez vos requêtes
Une meilleure pratique pour éviter les blocs SQL Server consiste à diviser les transactions longues en plusieurs transactions plus courtes. Les requêtes de longue durée maintiennent un verrou pendant toute la durée de la transaction, ce qui rend la ressource indisponible pour les autres processus. Diviser les transactions longues en transactions courtes permet de conserver les données en mouvement.
Envisagez d'utiliser le réglage SQL Server pour rendre les requêtes aussi efficaces que possible. Un bon optimiseur de requêtes écrira et réécrira les requêtes jusqu'à ce qu'elles soient configurées pour réduire le nombre de blocs susceptibles de ralentir les performances.
3. Identifiez la cause première du blocage de SQL Server
Le suivi des mesures de performances au fil du temps est un excellent moyen d'éviter le blocage de SQL Server. En localisant les sessions fréquemment bloquées et les instructions impliquées, vous pouvez déterminer un plan d'action pour supprimer les causes profondes des blocages récurrents via l'indexation, l'optimisation des requêtes ou d'autres moyens.
Un autre endroit où rechercher la cause première du blocage est la charge de travail du système. Exécutez une analyse de la charge de travail pour déterminer s'il y a eu une augmentation. Une charge de travail trop lourde entraînera le blocage de SQL Server, car le nombre croissant de requêtes s'accumulent en attendant l'accès aux ressources verrouillées. Vous devrez peut-être ajouter des index ou répartir la charge de travail sur plusieurs bases de données pour résoudre les problèmes de performances des charges de travail lourdes.
4. Gardez vos statistiques à jour
Des statistiques obsolètes peuvent déclencher l'exécution de plans de requête inefficaces car le plan n'a pas été mis à jour pour tenir compte des modifications. SQL Server lancera des analyses de recherche pour rechercher des données déplacées ou manquantes, ce qui créera à son tour des blocs.
Le moyen le plus efficace de maintenir les statistiques à jour consiste à automatiser autant de mises à jour que possible. Lorsque vous ne pouvez pas programmer de mises à jour automatiques, assurez-vous d'ajouter des mises à jour manuelles à votre liste de contrôle de maintenance planifiée pour vous assurer que les mises à jour sont effectuées régulièrement.
Le blocage de SQL Server peut faire partie de la vie des DBA, mais il existe des moyens d'atténuer son impact sur les performances de votre base de données SQL Server. Brisez le cycle blocage-déblocage en mettant en œuvre certaines des stratégies décrites ci-dessus. Avec un peu de planification, d'optimisation et d'automatisation, il est possible de réduire l'occurrence du blocage de SQL Server et, dans certaines circonstances, de l'éradiquer complètement.