J’ai une requête qui prend beaucoup de temps au cours d’une transaction. Quand je reçois la wait_type du processus, il est PAGEIOLATCH_SH. Que signifie ce type d’attente et comment cela peut-il être résolu ?
Réponse
Trop de publicités?À partir de MSDN:
PAGEIOLATCH_SH
Se produit lorsqu'une tâche est en attente sur un verrou pour un tampon dans un
I/O
la demande. Le loquet de la demande est en mode Partagé. Les longs délais d'attente peuvent indiquer des problèmes avec le sous-système de disque.
Dans la pratique, ce qui arrive presque toujours à cause de la grande scanne sur de grandes tables. Il n'arrive presque jamais dans les requêtes qui utilisent des index de manière efficace.
Si votre requête est comme ceci:
Select * from <table> where <col1> = <value> order by <PrimaryKey>
, vérifiez que vous disposez d'un indice composite sur (col1, col_primary_key)
.
Si vous n'en avez pas, alors vous aurez besoin d'un plein INDEX SCAN
si l' PRIMARY KEY
est choisi, ou un SORT
si un index sur col1
est choisi.
Deux d'entre eux sont très disk I/O
consommer des opérations sur de grandes tables.