De acordo com meus livros de leitura sobre problemas internos e solução de problemas do SQL Server 2008 (emprestados da biblioteca local de Illinois) por Christian Bolton, Brent Ozar etc. Estou tentando buscar compreensão e confirmação no servidor SQL e muitas pesquisas na Web, se alguém pode confirmar ou corrigir meu entendimento.
Toda consulta ou operação que requer concessão de memória de consulta precisará de memória do espaço de trabalho. Em consultas gerais usando Classificação, Associação de Hash Match, Paralelismo (Não tenho certeza disso), Inserção em Massa (Não tenho certeza), Reconstrução de Índice etc., precisarão da memória do espaço de trabalho da consulta.
A memória da área de trabalho faz parte do buffer pool do SQL Server (é alocada como parte do buffer pool) e a memória máxima da área de trabalho é 75% da memória alocada no buffer pool. Por padrão, uma única consulta não pode obter mais de 25% da memória da área de trabalho (no SQL 2008 / SQL 2012 - controlado pelo grupo de carga de trabalho padrão do Administrador de Recursos pronto para uso).
Buscando uma confirmação do meu entendimento
1) Considerando o sistema com 48 GB de RAM e memória máxima do servidor configurada para 40 GB, isso significa que a memória máxima do espaço de trabalho é limitada a 30 GB e uma única consulta não pode obter mais de 10 GB de memória do espaço de trabalho (memória de consulta). Portanto, se você tiver uma consulta ruim trabalhando com um bilhão de linhas que está fazendo uma junção de hash maciça e precisar de mais de 10 GB de memória (memória da área de trabalho), você se importaria de passar por essa fila de concessão de memória ou imediatamente derramar no disco?
2) Se uma consulta que está executando uma operação de classificação massiva tiver sido atribuída uma memória da área de trabalho de 5 MB e, durante a execução da consulta, o otimizador de consultas perceberá que, devido a estatísticas incorretas ou a índices ausentes, essa consulta realmente precisará de 30 MB de memória da área de trabalho. será derramado imediatamente para tempdb. Mesmo que o sistema tenha bastante memória do espaço de trabalho disponível durante a execução, uma vez que a consulta excedeu a memória concedida do espaço de trabalho durante a execução, ela deverá ser derramada no disco. Meu entendimento está correto?