Ajuste o SQL Server em servidor dedicado ou VM: max server memory, MAXDOP, cost threshold, tempdb com vários arquivos e dados, log e tempdb em NVMe.

Para que serve

Instalar o SQL Server com tudo no padrão funciona, mas em servidores com muita RAM e muitos núcleos o resultado costuma ser memória disputada com o Windows, consultas paralelas demais e tempdb virando gargalo. Este artigo mostra como configurar SQL Server 2019, 2022 ou 2025 em Windows Server 2022/2025 nos quatro pontos que mais fazem diferença: memória máxima, MAXDOP, tempdb e organização dos arquivos em NVMe. Vale tanto para instalação direta no servidor quanto para VM no Proxmox.

Pré-requisitos

  • Login com papel sysadmin e o SQL Server Management Studio (SSMS) ou sqlcmd.
  • Acesso de administrador ao Windows (para direitos de usuário e discos).
  • Uma janela de manutenção para reiniciar o serviço (só a mudança de tempdb exige).

1. Configurar SQL Server: memória máxima

Por padrão, o max server memory é praticamente ilimitado: o SQL Server vai ocupando a RAM até o Windows ficar sem folga, o que causa paginação e lentidão geral. A documentação da Microsoft recomenda começar com cerca de 75% da memória que não é usada por outros processos e ajustar observando o servidor. Na prática, em máquinas grandes, muitos DBAs deixam 10% da RAM (mínimo de 4 GB) para o sistema.

RAM do servidor/VMmax server memory (ponto de partida)
32 GB26–28 GB (26624–28672 MB)
64 GB56 GB (57344 MB)
128 GB112–115 GB (114688–117760 MB)

Subtraia também o que outros programas na mesma máquina usam (ERP, IIS, antivírus, agente de backup).

EXEC sp_configure 'show advanced options', 1;  RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 57344;  RECONFIGURE;

A mudança vale na hora, sem reiniciar. Em VM, desative o ballooning de memória no Proxmox e, opcionalmente, defina um min server memory razoável, para o buffer pool não ser esvaziado sob pressão.

Lock Pages in Memory (opcional): se o log de erros mostrar a mensagem 17890 ("A significant part of sql server process memory has been paged out"), conceda o direito Lock pages in memory à conta de serviço em secpol.msc → Políticas Locais → Atribuição de Direitos de Usuário, e reinicie o serviço. Só faça isso com o max server memory já configurado.

2. Configure o MAXDOP e o cost threshold for parallelism

O MAXDOP limita quantos núcleos uma única consulta pode usar em paralelo. O valor 0 (usar todos) raramente é o melhor em OLTP. Desde o SQL Server 2019 o instalador sugere um valor, mas confira. Primeiro veja quantos nós NUMA e processadores lógicos existem:

SELECT cpu_count, hyperthread_ratio, softnuma_configuration_desc,
       socket_count, numa_node_count
FROM sys.dm_os_sys_info;
SELECT node_id, online_scheduler_count FROM sys.dm_os_nodes
WHERE node_state_desc = 'ONLINE';

Regras da Microsoft (SQL Server 2016 em diante):

ConfiguraçãoRecomendação
Um nó NUMA, até 8 processadores lógicosMAXDOP igual ou menor que o número de processadores
Um nó NUMA, mais de 8MAXDOP = 8
Vários nós NUMA, até 16 lógicos por nóMAXDOP igual ou menor que os processadores por nó
Vários nós NUMA, mais de 16 lógicos por nóMetade dos processadores por nó, no máximo 16

O SQL Server cria nós soft-NUMA automaticamente quando há mais de 8 núcleos físicos por soquete, e a tabela considera esses nós. Exemplo: VM com 16 vCPUs em um nó → MAXDOP 8.

EXEC sp_configure 'max degree of parallelism', 8;  RECONFIGURE;
EXEC sp_configure 'cost threshold for parallelism', 50;  RECONFIGURE;

O cost threshold for parallelism padrão é 5, muito baixo para hardware atual: consultas pequenas acabam paralelizadas e geram esperas CXPACKET/CXCONSUMER. Valores entre 30 e 50 são um ponto de partida comum entre DBAs; ajuste observando as esperas. Fornecedores de ERP às vezes exigem MAXDOP 1: siga a orientação do fornecedor quando houver.

3. Organize os arquivos em NVMe

Separe dados, log de transações e tempdb em volumes diferentes. No servidor físico, isso pode ser feito em partições nos NVMe; em VM no Proxmox, crie discos virtuais separados no storage NVMe (bus SCSI com controladora VirtIO SCSI single e IO thread, drivers virtio-win instalados). Veja também banco em VM no Proxmox: disco, cache e ZFS.

  1. Formate os volumes de dados, log e tempdb em NTFS com unidade de alocação de 64 KB:
    Format-Volume -DriveLetter E -FileSystem NTFS -AllocationUnitSize 65536 -NewFileSystemLabel "SQLDATA"
  2. Defina os caminhos padrão da instância em SSMS → propriedades do servidor → Database Settings (dados em E:\, log em F:\).
  3. Ative a Instant File Initialization (o instalador oferece a opção "Grant Perform Volume Maintenance Task privilege"). Com ela, crescer e criar arquivos de dados é instantâneo. Confira com:
    SELECT servicename, instant_file_initialization_enabled FROM sys.dm_server_services;
  4. Configure crescimento automático em MB fixos (ex.: 1024 MB para dados, 512 MB para log), nunca em porcentagem, e dimensione os arquivos já no tamanho esperado.

4. Configure o tempdb

A recomendação da Microsoft: com até 8 processadores lógicos, um arquivo de dados por processador; com mais de 8, comece com 8 arquivos e só adicione de 4 em 4 se houver contenção. Todos com o mesmo tamanho e o mesmo crescimento. O instalador moderno já cria vários arquivos, mas costuma deixá-los pequenos e no disco do sistema.

ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'T:\tempdb\tempdb.mdf',  SIZE = 8GB, FILEGROWTH = 1GB);
ALTER DATABASE tempdb MODIFY FILE (NAME = temp2,   FILENAME = 'T:\tempdb\tempdb2.ndf', SIZE = 8GB, FILEGROWTH = 1GB);
-- repita para temp3 ... temp8
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'T:\tempdb\templog.ldf', SIZE = 8GB, FILEGROWTH = 1GB);

Use os nomes lógicos reais, vistos com SELECT name, physical_name FROM tempdb.sys.database_files;. Crie a pasta T:\tempdb e dê permissão à conta de serviço do SQL Server antes de reiniciar. A mudança de local só vale após reiniciar o serviço; os arquivos antigos podem ser apagados depois.

No SQL Server 2019 ou mais novo, cargas com muitas tabelas temporárias se beneficiam de metadados do tempdb em memória (exige restart):

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;

Como saber se funcionou

SELECT name, value_in_use FROM sys.configurations
WHERE name IN ('max server memory (MB)','max degree of parallelism',
               'cost threshold for parallelism');
SELECT name, physical_name, size*8/1024 AS size_mb FROM sys.master_files
WHERE database_id = 2;
  • No Gerenciador de Tarefas, a memória do Windows deve ter folga e o SQL Server estabilizar perto do limite definido.
  • Os arquivos do tempdb aparecem no volume NVMe, todos com o mesmo tamanho.
  • Esperas PAGELATCH_UP/PAGELATCH_EX em páginas do tempdb (database_id 2) diminuem em sys.dm_os_wait_stats.

Problemas comuns

O SQL Server não sobe depois de mover o tempdb

Pasta inexistente ou sem permissão para a conta de serviço. Inicie com configuração mínima pelo prompt (sqlservr.exe -f -m na pasta Binn, ou net start MSSQLSERVER /f /m), corrija o caminho com ALTER DATABASE tempdb MODIFY FILE e reinicie normalmente.

Defini max server memory baixo demais e o serviço não inicia

Inicie com -f (configuração mínima) e restaure um valor adequado.

Consultas ficaram mais lentas após mudar o MAXDOP

Algumas consultas analíticas se beneficiam de mais paralelismo. Ajuste por banco (ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 4;) ou por consulta com a dica OPTION (MAXDOP n).

Perguntas frequentes

Preciso reiniciar o SQL Server para mudar memória e MAXDOP?

Não. Os dois valem imediatamente após o RECONFIGURE. Só a mudança de local do tempdb e o Lock Pages in Memory exigem restart.

Por que o SQL Server usa quase toda a RAM?

É o comportamento esperado: ele guarda dados em cache até o limite configurado. Por isso o max server memory é importante.

Vale colocar o tempdb em disco separado mesmo com NVMe?

Sim, sempre que possível. Além do desempenho, um tempdb que cresce sem controle não enche o volume de dados ou de log.

Leitura complementar

Precisa de ajuda?

Se precisar confirmar quantos soquetes, núcleos e discos NVMe o seu servidor tem, abra um ticket ou consulte o inventário pelo console IPMI/iLO.

Esta resposta lhe foi útil? 0 Usuários acharam útil (0 Votos)

Leia também