A memória do espaço de trabalho (parte do buffer pool) é limitada apenas para Hash Join, Sort etc.?
Se eu tiver uma consulta que usa uma junção de loop aninhada (sem uma classificação ou hash), ela não usaria a memória do espaço de trabalho?
Onde seria criada a tabela de trabalho para uma consulta simples que retorna 100 linhas? em Tempb..
Se uma consulta não tiver uma concessão de memória, ela não poderá solicitar memória desse 'espaço de trabalho'. Você pode ver quais consultas solicitam memória em
sys.dm_exec_query_memory_grants
. Como você já percebeu, apenas alguns operadores solicitam concessões de memória, ou seja, os operadores que exigem algum armazenamento intermediário significativo. Um loop aninhado não requer nenhum armazenamento, pois opera uma linha por vez e, portanto, não solicitará uma concessão de memória. Um hash requer memória para criar as tabelas de hash e uma classificação obviamente requer tabelas de classificação. As consultas sem concessão ainda precisam de alguma memória, mas isso se soma a quantidades triviais (talvez alguns KBs) e essa memória é obtida de alocadores de execução comuns . Uma concessão é medida geralmente em MBs e pode chegar a centenas de MBs.A memória reservada para concessões não é exatamente 'parte do buffer pool', o que faz parecer que é uma parte separada do buffer pool. É mais uma área cinzenta. A concessão de memória é suportada pelo buffer pool. Uma consulta que recebe uma quantidade X de memória coloca uma reserva no BP. Ele não 'rouba' as páginas da BP imediatamente. Mas como a (parte não roubada de) BP contém dadospáginas, o BP pode cumprir a promessa de reserva porque pode despejar páginas de dados no disco a qualquer momento que desejar. À medida que a consulta avança pode solicitar ao BP páginas da outorga que adquiriu (da reserva) e à medida que o BP atende ao pedido, as páginas entregues à consulta tornam-se realmente 'roubadas', ou seja. o BP não pode mais usá-los para dados até que a consulta os libere de volta. Para garantir que todas as concessões possam ser honradas, a soma das reservas não pode exceder o tamanho do BP (ou seja, não há superalocação no estilo VM). Essas reservas de concessão tendem a errar no lado da superalocação por uma margem generosa, pois as coisas podem ficar muito feias se uma consulta consumir toda a concessão e ainda precisar de memória: ocorrem derramamentos (extremamente lentos) ou a consulta pode desistir e gerar erros.
Consulte Compreendendo a concessão de memória do servidor SQL
Link Archive.org