Che cos'è il tipo di attesa PAGEIOLATCH_SH in SQL Server?


96

Ho una query che sta impiegando molto tempo nel mezzo di una transazione. Quando ottengo wait_typeil processo è PAGEIOLATCH_SH.

Che cosa significa questo tipo di attesa e come può essere risolto?

Risposte:


116

Dalla documentazione Microsoft :

PAGEIOLATCH_SH

Si verifica quando un'attività è in attesa di un latch per un buffer contenuto in una I/Orichiesta. La richiesta di latch è in modalità condivisa. Attese lunghe possono indicare problemi con il sottosistema del disco.

In pratica, questo accade quasi sempre a causa di scansioni di grandi dimensioni su tabelle di grandi dimensioni. Non accade quasi mai nelle query che utilizzano gli indici in modo efficiente.

Se la tua query è così:

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

, controlla di avere un indice composto su (col1, col_primary_key).

Se non ne hai uno, allora avrai bisogno di un full INDEX SCANse PRIMARY KEYviene scelto il, o di un SORTse col1viene scelto un indice su .

Entrambi sono I/Ooperazioni che consumano molto disco su tabelle di grandi dimensioni.


È una domanda davvero semplice. Seleziona * da <table> dove <col1> = <value> order by <PrimaryKey>. Abbiamo anche un indice solo su col1 e abbiamo provato a ricostruire l'indice.
Ryan

Puoi suggerire alcune risorse per imparare la comprensione che hai di ciò che è intensivo per il disco, cosa richiede una scansione completa dell'indice, cosa richiede un ordinamento ecc.
Greg B

1
@GregB: se hai già una conoscenza di base di SQL, potresti leggere i libri di Joe Celko (tutti ma soprattutto SQL for Smartiese Thinking in Sets) e il mio blog ovviamente :)
Quassnoi

3
Ciò indicava un errore nel nostro sottosistema del disco. Un disco RAID si era guastato senza attivare il sistema di monitoraggio. Il controllo dei registri degli eventi ha rilevato che SMART aveva effettivamente contrassegnato un'unità come danneggiata.
Gomibushi

7

PAGEIOLATCH_SH il tipo di attesa di solito viene visualizzato come risultato di un indice frammentato o non ottimizzato.

Spesso i motivi per un PAGEIOLATCH_SHtipo di attesa eccessivo sono:

  • Il sottosistema I / O ha un problema o non è configurato correttamente
  • Sottosistema di I / O sovraccarico da altri processi che producono un'attività di I / O elevata
  • Cattiva gestione degli indici
  • Idea sbagliata dell'unità logica o fisica
  • Problemi di rete / latenza
  • Pressione di memoria
  • Mirroring sincrono e AlwaysOn AG

Per provare a risolvere il problema con un PAGEIOLATCH_SHtipo di attesa elevato , puoi controllare:

  • SQL Server, query e indici, poiché molto spesso questo potrebbe essere trovato come causa principale dei PAGEIOLATCH_SHtipi di attesa eccessivi
  • Per la pressione della memoria prima di passare alla risoluzione dei problemi del sottosistema I / O

Tenere sempre presente che in caso di mirroring ad alta sicurezza o disponibilità di commit sincrono in AlwaysOn AG, ci si PAGEIOLATCH_SHpuò aspettare un aumento / eccessivo .

È possibile trovare ulteriori dettagli su questo argomento nell'articolo Gestione dei tipi di attesa eccessivi di SQL Server PAGEIOLATCH_SH

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.