Réduire les blocages au niveau de la page sur la requête de mise à jour sur MS SQL
-
11-07-2019 - |
Question
J'ai une impasse amusante causée par une stupide requête SQL UPDATE simple, sur une table plate, sous la valeur par défaut "READ COMMITED". transaction.
UPDATE table SET column=@P1 WHERE PK=@P2
La colonne PK
est varchar (11)
et contient un index clusterisé.
pas de déclencheur ni de relation de table, etc. sur la table.
J'ai vérifié et constaté que l'impasse se produisait sur "PAGE". niveau, pas au niveau du droit de passage / enregistrement. Ensuite, je constate que pour chaque requête de mise à jour, il faut 100 verrous de page (et plus). (Cela n’a aucun sens pour moi car je mets à jour une ligne à la fois)
Y a-t-il un moyen d'empêcher que des impasses se produisent? Ou comment réduire le nombre de verrous nécessaires pour une mise à jour d'une seule ligne sans utiliser le curseur?
-
Merci pour votre suggestion.
J'ai essayé de reconstruire l'index plusieurs fois, avec des facteurs de remplissage élevés et faibles. J'avais essayé de faire en sorte que les processus mettent à jour différentes positions / tranches. Mais rien n’a été amélioré ni pire.
-
J'ai essayé SQL Server Profiler. J'en ai capturé quelques-uns " Lock: Deadlock Chain " et "Lock: Deadlock", mais pas de " graphe de blocage " a été capturé. Les deux parties effectuent la requête de mise à jour simple en mode de validation automatique à validation validée.
Lock:Deadlock Chain 17887475 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887476 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102 265006271 0 0X56AF060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887477 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887478 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206 265006240 0 0XDE80060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887479 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206 265006271 0 0XDE80060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887480 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887481 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066 265006240 0 0X5280060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887482 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066 265006271 0 0X5280060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887483 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887484 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614 265006271 0 0X8E7E060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887485 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange Lock:Deadlock Chain 17887486 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687 265006271 0 0XBF82060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887487 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887488 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392 265006271 0 0XB07D060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887489 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887491 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887493 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887494 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792 265006271 0 0X50A6060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock Chain 17887495 1 0X01 4 myserver 2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock 0 971497 102 - Resource type Exchange
Lock:Deadlock Chain 17887496 1 0X01 4 myserver 2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206 265006271 0 0XBEAF060001000000000000001B0006 27 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock
Lock:Deadlock 17887497 myuser 0XCD85FBB269700B4AA2F4E8579D118999 209 myserver myuser 2008-11-28 10:16:45.930 1:426206 265006271 myapps 0 0XDE80060001000000000000001B0006 123 27 281 2008-11-28 10:16:46.210 myclient 0 - LOCK 4 - U 0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971498
La solution 6
Je dois enfin faire une solution de contournement en utilisant cusror dans une procédure stockée.
Mais il est toujours intéressant de savoir comment le verrouillage de la page se produit et comment le résoudre.
Après quelques recherches supplémentaires sur Google, d'autres personnes ont le même problème et (de MSDN forum) suggèrent de désactiver le parallélisme dans SQL Server 2005, mais je n'ai jamais eu l'occasion d'essayer.
Autres conseils
Vous avez 2 options pour réduire l'escalade de verrous:
1) Ajoutez l’indicateur WITH (ROWLOCK) pour demander au serveur SQL de prendre des verrous de granularité plus fins (votre kilométrage peut varier:
UPDATE table WITH (ROWLOCK) SET colonne = @ P1 O PK = @ P2; Tant que PK varchar (11), a un index clusterisé sur il. pas de relation tigger ou table..etc sur la table.
2) mettez à jour les lignes dans un ordre aléatoire, ce qui réduit le risque que les verrous de lignes deviennent des verrous de page.
De plus, le fait de s'assurer que les index de cette table sont à jour peut souvent réduire le verrouillage. Comme le peut le fait de laisser un facteur de remplissage (90, c'est bien) si vous allez faire beaucoup d'inserts.
Avez-vous exécuté une trace de profil?
Lancez SQL Profiler et créez une trace standard avec ces événements ajoutés:
- Verrous: graphe de blocage
- Verrous: Verrou: Chaîne de blocage
- Verrous: Verrou: Escalade
Devrait devrait fournir des détails sur la nature précise de l’impasse.
Dans les cas simples et normaux, ce type d’origine est rarement observé. Ma question est la suivante: qu'y a-t-il de l'autre côté de cette transaction? Quelle est l'autre instruction de mise à jour en cours d'exécution et à l'origine de ce blocage? Je pense que ce sera la clé pour diagnostiquer ce problème. Honnêtement, mon argent est sur cette autre requête, non identifiée auparavant, étant le coupable. Et je suis à Vegas maintenant ...
Quelles instructions select de la même table ET les mêmes enregistrements se produisent-ils dans la même transaction avant l'instruction update? Utilisez des astuces de verrouillage (mises à jour) dans ces sélections.
avez-vous des déclencheurs UPDATE sur la table? Si tel est le cas, l’action du déclencheur pourrait être à l’origine de votre impasse.