Attentes PAGELATCH_ * et WRITELOG élevées. Sont-ils liés?

11

Nous voyons des types d'attente PAGELATCH_EX et PAGELATCH_SH très élevés ainsi que des attentes WRITELOG élevées. J'ai diagnostiqué la requête à l'origine des attentes PAGELATCH et je peux les éliminer en réduisant le taux d'insertion dans une clé primaire en cluster occupée définie avec une valeur IDENTITY. Je comprends que ce phénomène est connu sous le nom de conflit de verrouillage d'insertion de dernière page.

Cependant, ma question est lorsqu'un nouvel enregistrement est inséré, SQL Server prend-il un PAGELATCH_EX exclusif sur une page tampon, insère-t-il l'enregistrement dans la page tampon, écrit-il l'enregistrement dans le journal des transactions , puis libère le PAGELATCH_EX exclusif comme détaillé https: // www.microsoft.com/en-ie/download/details.aspx?id=26665 page 24. Ou écrit-il d'abord l'enregistrement dans le journal des transactions avant de prendre le PAGELATCH_EX comme détaillé "Résolution du conflit PAGELATCH sur les charges de travail INSERT hautement concurrentes" - Informations générales SQLCAT's Guide to: Relational Engine

Si l'enregistrement est écrit pour se connecter en dehors du mécanisme de verrouillage, je peux exclure les écritures lentes sur le disque comme cause d'attentes PAGELATCH élevées. Mais si le verrou est maintenu jusqu'à ce que l'enregistrement soit durci, je devrais probablement prendre WRITELOG en considération.

De plus, le fait d'avoir plusieurs index non clusterisés entraînerait le maintien du verrou PAGELATCH_ * plus longtemps, c'est-à-dire si une table a un cluster et que plusieurs index non clusterisés sont des verrous ajoutés et libérés simultanément dans chacune des pages de tampon d'index?

Mise à jour 1 Après avoir lu confio-sql-server-writelog-wait, diapositive deux et architecture WAL générale. Je comprends maintenant que l'étape "Enregistrer une entrée de journal que la ligne a été modifiée" détaillée dans les deux livres blancs fait référence à SQL Server qui enregistre une modification dans le cache du journal des transactions, pas sur le disque. Une fois la transaction terminée ou le tampon plein, tous les enregistrements sont immédiatement vidés sur le disque.

Pixélisé
la source
1
En regardant un problème très similaire à ce droit en ce moment ..
Dave Lawrence
Avez-vous étudié des VLF potentiellement élevés qui causent des problèmes?
Kin Shah
@Kin, voulez-vous dire en termes de vidage lent du journal sur le disque maintenant ouvert un verrou PAGELATCH_EX et provoquant un conflit de verrou?
Pixelé le
Il n'y a aucune raison qu'une implémentation de SQL Server doive générer l'enregistrement de journal sous un verrou de page. Pourquoi le feraient-ils de cette façon? Peu plausible. De plus, si les écritures de journal étaient effectuées sous patchlatch, vous ne verriez presque jamais attendre WRITELOG. Il ne peut y avoir qu'un seul type d'attente à la fois.
usr

Réponses:

1

Cependant, ma question est lorsqu'un nouvel enregistrement est inséré, SQL Server prend-il un PAGELATCH_EX exclusif sur une page tampon, insère-t-il l'enregistrement dans la page tampon, écrit-il l'enregistrement dans le journal des transactions, puis libère l'exclusif PAGELATCH_EX

Vous devez noter que le verrou protège uniquement l'intégrité physique de la page lorsqu'elle est en mémoire, de sorte que le verrou serait pris lorsque la page est en mémoire. Supposons qu'un enregistrement soit inséré et pour cette page doit être récupéré. Tout d'abord, la page serait verrouillée et mise en mémoire, puis elle serait verrouillée et les informations seraient écrites. Le processus après cela serait

  • Générer un enregistrement de journal

  • Mettre à jour le LSN de la page pour correspondre à celui de l'enregistrement du journal

  • Modifier les données (salir la page)

  • Déverrouiller le loquet

  • Valider le début de la transaction

  • FlushToLSN de validation

  • Déverrouiller les verrous

  • Validation de la transaction terminée

Pour plus de détails et d'explications sur les étapes ci-dessus, veuillez lire le blog de présentation des E / S de Bob Dorr

Les attentes Pagelatch * sont des attentes non E / S et j'ai vu la plupart du temps que ces attentes sont importantes en raison de la contention d'allocation. Mon intuition est que cela doit faire quelque chose avec la façon dont tempdb is configured. Alors, comment votre tempdb est-il configuré?, Combien de fichiers de données tempdb sont présents? Assurez-vous qu'ils ont la même croissance automatique et la même taille. Lorsqu'une nouvelle page est créée, les pages système telles que les pages GAM, SGAM et PFS doivent être mises à jour ou accessibles et lorsque SQL Server trouve des conflits dans l'accès à ces pages, une telle attente apparaît.

Shanky
la source
Salut @Shanky, basé sur sys.dm_os_waiting_tasks.resource_description couplé avec DBCC PAGE et le type de PAGELATCH_ * J'ai exclu tempDB. Sur la base de la chaîne d'événements de Bob Dorr, il semble que l'étape "Générer un enregistrement de journal" soit terminée dans le mécanisme de verrouillage?
Pixelé le
3
Les deux sont des événements mutuellement exclusifs, l'écriture dans le fichier journal n'a rien à voir avec le verrouillage de son seul serveur SQL suivant le protocole WAL pour écrire des informations dans le journal avant de valider la transaction
Shanky