As páginas são lidas na memória conforme necessário; se não houver memória disponível, a página não modificada mais antiga será substituída pela página de entrada.
Isso significa que, se você executar uma consulta que exija mais dados do que pode caber na memória, muitas páginas terão uma vida útil muito curta na memória, resultando em muitas E / S.
Você pode ver esse efeito consultando o contador "Expectativa de vida da página" no Windows Performance Monitor. Consulte https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy para obter ótimos detalhes sobre esse contador.
Nos comentários, você perguntou especificamente o que acontece quando os resultados da consulta são maiores que o espaço disponível no buffer. Pegue o exemplo mais simples, select * from some_very_big_table;
- suponha que a tabela tenha 32 GB e max server memory (MB)
esteja configurada em 24 GB. Todos os 32 GB de dados da tabela serão lidos nas páginas do buffer de páginas, uma de cada vez, travadas, formatado em pacotes de rede e enviado através do fio. Isso acontece página por página; você poderia ter 300 dessas consultas em execução ao mesmo tempo e, supondo que não houvesse bloqueio, os dados de cada consulta seriam lidos no espaço do buffer da página, uma página de cada vez, e colocados na conexão o mais rápido que o cliente puder solicitar e consumir os dados. Depois que todos os dados de cada página tiverem sido enviados para a conexão, a página será desbloqueada e será rapidamente substituída por outra página do disco.
No caso de uma consulta mais complexa, por exemplo, agregando resultados de várias tabelas, as páginas serão puxadas para a memória exatamente como acima, conforme exigido pelo processador de consultas. Se o processador de consultas precisar de espaço de trabalho temporário para calcular resultados, ele saberá disso antecipadamente quando compilar um plano para a consulta e solicitará espaço de trabalho (memória) do SQLOS . O SQLOS, em algum momento (supondo que não atinja o tempo limite ), conceda essa memória ao processador de consultas, momento em que o processamento da consulta será retomado. Se o processador de consultas cometer um erro na estimativa de quanta memória solicitar do SQLOS, talvez seja necessário executar um "derramamento em disco"operação, onde os dados são temporariamente gravados no tempdb de forma intermediária. As páginas que foram gravadas no tempdb serão desbloqueadas quando forem gravadas no tempdb para dar espaço para outras páginas serem lidas na memória. Eventualmente, o processo de consulta retornará aos dados armazenados no tempdb, paginando os que usam travas, nas páginas do buffer marcadas como livres.
Sem dúvida, estou sentindo falta de muitos detalhes técnicos no resumo acima, mas acho que isso captura a essência de como o SQL Server pode processar mais dados do que cabem na memória.