Les pages sont lues en mémoire selon les besoins, s'il n'y a pas de mémoire libre disponible, la page la plus ancienne non modifiée est remplacée par la page entrante.
Cela signifie que si vous exécutez une requête qui nécessite plus de données que la mémoire ne peut en contenir, de nombreuses pages auront une durée de vie très courte en mémoire, ce qui entraînera beaucoup d'E / S.
Vous pouvez voir cet effet en consultant le compteur «Durée de vie de la page» dans l'Analyseur de performances Windows. Regardez https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy pour de grands détails sur ce compteur.
Dans les commentaires, vous avez demandé spécifiquement ce qui se passe lorsque les résultats de la requête sont supérieurs à l'espace tampon disponible. Prenons l'exemple le plus simple, select * from some_very_big_table;
supposez que la table fait 32 Go et qu'elle max server memory (MB)
est configurée à 24 Go. Toutes les 32 Go de données de table seront lues dans les pages du tampon de pages une par une, verrouillées, formaté en paquets réseau et envoyé sur le câble. Cela se produit page par page; vous pouvez avoir 300 requêtes de ce type exécutées en même temps, et en supposant qu'aucun blocage ne se produise, les données de chaque requête seront lues dans l'espace tampon de page, une page à la fois, et mises sur le câble aussi vite que le client le pourra demander et consommer les données. Une fois que toutes les données de chaque page ont été envoyées sur le fil, la page se déverrouille et sera très rapidement remplacée par une autre page du disque.
Dans le cas d'une requête plus complexe, par exemple en agrégeant les résultats de plusieurs tables, les pages seront tirées en mémoire exactement comme ci-dessus car elles sont requises par le processeur de requêtes. Si le processeur de requêtes a besoin d'un espace de travail temporaire pour calculer les résultats, il le saura dès le départ lorsqu'il compilera un plan pour la requête et demandera un espace de travail (mémoire) à SQLOS . SQLOS sera à un moment donné ( en supposant qu'il n'a pas à temps ), accorder que la mémoire au processeur de requête, au cours de laquelle le traitement point de requête reprendra. Si le processeur de requêtes fait une erreur dans son estimation de la quantité de mémoire à demander à SQLOS, il peut avoir besoin d'effectuer un "déversement sur le disque"opération, où les données sont temporairement écrites dans tempdb sous une forme intermédiaire. Les pages qui ont été écrites dans tempdb seront déverrouillées une fois qu'elles auront été écrites dans tempdb pour faire de la place pour que d'autres pages soient lues en mémoire. Finalement, le processus de requête retournera aux données stockées dans tempdb, en paginant cela en utilisant le verrouillage, dans les pages du tampon qui sont marquées comme libres.
Je manque sans aucun doute une charge de détails très techniques dans le résumé ci-dessus, mais je pense que cela capture l'essence de la façon dont SQL Server peut traiter plus de données que la mémoire ne peut en contenir.