Qu'est-ce que le type d'attente PAGEIOLATCH_SH dans SQL Server?

96

J'ai une requête qui prend beaucoup de temps au milieu d'une transaction. Quand je connais wait_typele processus, c'est PAGEIOLATCH_SH.

Que signifie ce type d'attente et comment cela peut-il être résolu?

Ryan
la source

Réponses:

116

À partir de la documentation Microsoft :

PAGEIOLATCH_SH

Se produit lorsqu'une tâche attend sur un verrou pour un tampon qui se trouve dans une I/Odemande. La demande de verrouillage est en mode partagé. De longues attentes peuvent indiquer des problèmes avec le sous-système de disque.

En pratique, cela se produit presque toujours en raison de grands scans sur de grandes tables. Cela n'arrive presque jamais dans les requêtes qui utilisent efficacement les index.

Si votre requête ressemble à ceci:

Select * from <table> where <col1> = <value> order by <PrimaryKey>

, vérifiez que vous disposez d'un index composite activé (col1, col_primary_key).

Si vous n'en avez pas, vous aurez besoin soit d'un plein INDEX SCANsi le PRIMARY KEYest choisi, soit d'un SORTsi un index sur col1est choisi.

Les deux sont I/Odes opérations très consommatrices de disque sur de grandes tables.

Quassnoi
la source
C'est une vraie requête simple. Sélectionnez * dans <table> où <col1> = <valeur> trié par <PrimaryKey>. Nous avons également un index uniquement sur col1 et avons essayé de reconstruire l'index.
Ryan
Pouvez-vous suggérer des ressources pour apprendre la compréhension que vous avez de ce qui est gourmand en disque, de ce qui nécessite une analyse complète de l'index, de ce qui nécessite un tri, etc.
Greg B
1
@GregB: si vous avez déjà une connaissance de base de SQL, vous pouvez lire les livres de Joe Celko (tous mais surtout SQL for Smartieset Thinking in Sets) et mon blog bien sûr :)
Quassnoi
3
Cela indique une erreur dans notre sous-système de disque. Un disque RAID est tombé en panne sans déclencher le système de surveillance. La vérification des journaux d'événements a révélé que SMART avait effectivement marqué un lecteur comme étant défectueux.
Gomibushi
7

PAGEIOLATCH_SH Le type d'attente est généralement le résultat d'un index fragmenté ou non optimisé.

Les raisons d'un PAGEIOLATCH_SHtype d'attente excessif sont souvent :

  • Le sous-système d'E / S a un problème ou est mal configuré
  • Sous-système d'E / S surchargé par d'autres processus qui produisent l'activité d'E / S élevée
  • Mauvaise gestion des index
  • Idée fausse de lecteur logique ou physique
  • Problèmes de réseau / latence
  • Pression mémoire
  • Mise en miroir synchrone et AlwaysOn AG

Afin d'essayer de résoudre le problème du PAGEIOLATCH_SHtype d'attente élevé , vous pouvez vérifier:

  • SQL Server, requêtes et index, car cela peut souvent être trouvé comme une cause fondamentale des PAGEIOLATCH_SHtypes d'attente excessifs
  • Pour la pression de la mémoire avant de sauter dans un dépannage de sous-système d'E / S

Gardez toujours à l'esprit qu'en cas de mise en miroir de sécurité élevée ou de disponibilité de validation synchrone dans AlwaysOn AG, une augmentation / un excès PAGEIOLATCH_SHpeut être attendu.

Vous pouvez trouver plus de détails sur ce sujet dans l'article Gestion des types d'attente excessifs de SQL Server PAGEIOLATCH_SH

G.Hunt
la source