Le pagine vengono lette in memoria come richiesto, se non è disponibile memoria libera, la pagina non modificata più vecchia viene sostituita con la pagina in arrivo.
Ciò significa che se si esegue una query che richiede più dati di quanti ne possano contenere in memoria, molte pagine avranno una durata molto breve in memoria, con conseguente I / O elevato.
Puoi vedere questo effetto osservando il contatore "Aspettativa di vita della pagina" in Windows Performance Monitor. Guarda https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy per alcuni grandi dettagli su quel contatore.
Nei commenti, hai chiesto in particolare cosa succede quando i risultati della query sono più grandi dello spazio buffer disponibile. Prendiamo l'esempio più semplice, select * from some_very_big_table;
- supponiamo che la tabella sia di 32 GB e max server memory (MB)
sia configurata a 24 GB. Tutti i 32 GB di dati della tabella verranno letti in pagine nel buffer di pagina una alla volta, bloccati, formattato in pacchetti di rete e inviato attraverso il filo. Questo accade pagina per pagina; potresti avere 300 di queste query in esecuzione contemporaneamente e supponendo che non si stia verificando alcun blocco, i dati per ciascuna query verrebbero letti nello spazio del buffer di pagina, una pagina alla volta e inseriti nel filo il più velocemente possibile dal client richiedere e consumare i dati. Una volta che tutti i dati di ciascuna pagina sono stati inviati sul filo, la pagina diventa sbloccata e verrà rapidamente sostituita da un'altra pagina dal disco.
Nel caso di una query più complessa, ad esempio aggregando i risultati di più tabelle, le pagine verranno rimosse in memoria esattamente come sopra come richiesto dal processore di query. Se il processore di query necessita di uno spazio di lavoro temporaneo per calcolare i risultati, lo saprà in anticipo quando compila un piano per la query e richiederà spazio di lavoro (memoria) da SQLOS . SQLOS ad un certo punto (supponendo che non time out ), concedere che la memoria al processore di query, in cui l'elaborazione di query punto riprende. Se il Query Processor commette un errore nella stima della quantità di memoria da richiedere a SQLOS, potrebbe essere necessario eseguire uno "spill to disk"operazione, in cui i dati vengono temporaneamente scritti in tempdb in una forma intermedia. Le pagine che sono state scritte su tempdb verranno sbloccate una volta scritte su tempdb per fare spazio per altre pagine da leggere in memoria. Alla fine il processo di query tornerà ai dati memorizzati in tempdb, paginandoli nell'utilizzo del latching, nelle pagine del buffer contrassegnate come libere.
Sicuramente mi manca un sacco di dettagli molto tecnici nel sommario sopra, ma penso che catturi l'essenza di come SQL Server può elaborare più dati di quanti ne possano contenere in memoria.