J'ai une requête qui prend beaucoup de temps au milieu d'une transaction. Quand j'aurai le wait_type
du processus c'est PAGEIOLATCH_SH
.
Qu'est-ce que ce type d'attente signifie et comment cela peut-il être résolu?
De [~ # ~] msdn [~ # ~] :
PAGEIOLATCH_SH
Se produit lorsqu'une tâche attend un verrou pour un tampon se trouvant dans un
I/O
demande. La demande de verrouillage est en mode partagé. De longues attentes peuvent indiquer des problèmes avec le sous-système de disque.
Dans la pratique, cela se produit presque toujours à cause de grands balayages sur de grandes tables. Cela ne se produit presque jamais dans les requêtes qui utilisent efficacement les index.
Si votre requête est comme ceci:
Select * from <table> where <col1> = <value> order by <PrimaryKey>
, vérifiez que vous avez un index composite sur (col1, col_primary_key)
.
Si vous n'en avez pas, alors vous aurez besoin d'un INDEX SCAN
si la PRIMARY KEY
est choisi, ou SORT
si un index sur col1
est choisi.
Les deux d'entre eux sont très disque I/O
opérations gourmandes sur de grandes tables.
Le type d'attente PAGEIOLATCH_SH
Apparaît généralement à la suite d'un index fragmenté ou non optimisé.
Les raisons du type d'attente excessive PAGEIOLATCH_SH
Sont les suivantes:
Afin d'essayer de résoudre le type d'attente élevé PAGEIOLATCH_SH
, Vous pouvez vérifier:
PAGEIOLATCH_SH
Gardez toujours à l'esprit qu'en cas de sécurité élevée une disponibilité en miroir ou en validation synchrone dans AlwaysOn AG peut entraîner une augmentation/excessive PAGEIOLATCH_SH
.
Vous trouverez plus de détails sur ce sujet dans l'article Gestion des types d'attente excessifs de SQL Server PAGEIOLATCH_SH