Memória interna da área de trabalho

13

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?

SQL Learner
fonte

Respostas:

13

você se importaria de passar por essa fila de concessão de memória ou imediatamente derramar no disco?

Não é assim que funciona. Depois que um plano foi escolhido que requer uma concessão de memória, a consulta deve obter a concessão para que ela passe pela fila. O derramamento, se houver, ocorre muito mais tarde no ciclo de execução. Uma consulta não pode decidir ir em frente sem a concessão e 'derramar'. Ele deve receber a concessão e, com base nisso, iniciar a execução. Se a concessão for insuficiente (devido a uma estimativa incorreta ou à obtenção de uma concessão muito menor do que a solicitada), a consulta será forçada a derramar.

se o otimizador de consultas perceber que, devido a estatísticas ruins ou índices ausentes

A rigor, não é o otimizador, é a execução da consulta. O Query Optimizer tem apenas uma palavra a dizer na decisão do plano, mas, uma vez escolhido e lançado em execução, o otimizador fica fora de cena. Além disso, 'índices ausentes' não desempenham nenhum papel aqui. Um índice ausente pode forçar um plano ruim, mas não pode influenciar como esse plano 'ruim' é executado, pois esse plano foi construído considerando exatamente quais índices realmente existem para que ele saiba exatamente o que pode e o que não pode fazer. Os derramamentos ocorrem quase sempre devido a estimativas ruins, ou seja. estatísticas ruins ou algoritmos de estimativa de cardinalidade ruim no otimizador e na execução (fica muito complexo se você se aprofundar nos detalhes, então eu vou parar por aqui).

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

Infelizmente sim. No entanto, o otimizador deve apresentar um plano que aproveite a RAM disponível.

Eu recomendo ler Noções básicas sobre concessão de memória do servidor SQL é a melhor informação sobre o assunto por uma ampla margem.

Remus Rusanu
fonte
4
Remus Rusanu (MSFT) Também procurei em seu blog durante a pesquisa na Web relacionada a operadores que exigem concessão de memória de consulta. Obrigado, você é uma verdadeira jóia que apoia este fórum.
SQL Learner
Remus, a sessão de cúpula do PASS de Adam Machanic é muito completa e esclarece todas as perguntas relacionadas à memória da área de trabalho.
SQL Learner