Otimize o alto uso de memória em instâncias

Este documento explica como revisar e otimizar uma instância do Cloud SQL para SQL Server se ela for identificada pelo recomendador de instância subprovisionada como tendo alto consumo de memória.

Memória do SQL Server

A memória do SQL Server pode ser dividida no seguinte:

Caches

São objetos em um disco que podem ser recarregados, como páginas de banco de dados e procedimentos armazenados. Como resultado, o SQL Server pode aumentar ou diminuir esses objetos com base na utilização da memória. Caches incluem pools de buffers e caches de plano.

Memória fixa

A memória fixa pode aumentar e diminuir. Ela só diminui quando não está em uso; por exemplo, quando o número de conexões cai ou o número de consultas em execução diminui. É diferente de caches. Se não houver memória fixa suficiente, o SQL Server pode ficar sem memória. A memória fixa inclui memória de conexão e concessões de memória.

Sobrecarga do SQL Server

A sobrecarga do SQL Server inclui threads e pilhas.

OLTP na memória

O OLTP na memória inclui tabelas na memória e grupos de arquivos na memória.

O consumo de memória pelo SQL Server é controlado pela configuração maximum server memory e memory.memory.limitmb . O parâmetro memory.memory.limitmb é definido automaticamente pelo Cloud SQL.

Para saber mais sobre memory.memory.limitmb , consulte a documentação da Microsoft .

Você deve definir o limite max server memory para um valor adequado. No SQL Server, se o max server memory não for definido, as páginas do banco de dados podem consumir a maior parte da memória, chegando a até 100%. Isso às vezes pode ser enganoso.

Opções de otimização de memória

Para determinar se uma instância precisa de mais ajuste de memória, faça o seguinte:

  • Defina o valor de max server memory . A recomendação geral é definir a max server memory em cerca de 80% para evitar que o SQL Server consuma toda a memória disponível. Para instâncias com grandes quantidades de memória, 80% pode ser um valor muito baixo e pode levar ao desperdício de memória.

  • Monitorar Page life expectancy

    Page life expectancy indica o tempo, em segundos, que a página mais antiga permanece no buffer pool. Esse valor deve ser superior a 300, conforme recomendado pela Microsoft. Se ficar consistentemente abaixo de 300, pode ser um indício de que a instância está enfrentando alta utilização de memória. Execute a seguinte consulta para monitorar Page life expectancy .

    SELECT 
      [object_name],
      [counter_name],
      [cntr_value] 
    FROM 
      sys.dm_os_performance_counters
    WHERE 
      [object_name] 
    LIKE 
      '%Manager%'
    AND 
      [counter_name] = 'Page life expectancy'
    
  • Verifique Memory Grants Pending

    Memory Grants Pending especifica o número total de processos aguardando uma concessão de memória do espaço de trabalho. Execute a consulta a seguir para verificar Memory Grants Pending . Se essa consulta mostrar consistentemente concessões pendentes, isso indica alta utilização de memória. Você pode reduzir esse número consultando as esperas do banco de dados e ajustando qualquer instrução que esteja aguardando memória.

    SELECT
      @@SERVERNAME AS [Server Name],
      RTRIM([object_name]) AS [Object Name],
      cntr_value AS [Memory Grants Pending]
    FROM 
      sys.dm_os_performance_counters WITH(NOLOCK)
    WHERE
      [object_name] 
    LIKE 
      N'%Memory Manager%'  -- Handles named instances
    AND 
      counter_name = N'Memory Grants Pending'
    

O que vem a seguir