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
sysadmine o SQL Server Management Studio (SSMS) ousqlcmd. - 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/VM | max server memory (ponto de partida) |
|---|---|
| 32 GB | 26–28 GB (26624–28672 MB) |
| 64 GB | 56 GB (57344 MB) |
| 128 GB | 112–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ção | Recomendação |
|---|---|
| Um nó NUMA, até 8 processadores lógicos | MAXDOP igual ou menor que o número de processadores |
| Um nó NUMA, mais de 8 | MAXDOP = 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.
- 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" - Defina os caminhos padrão da instância em SSMS → propriedades do servidor → Database Settings (dados em
E:\, log emF:\). - 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; - 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_EXem páginas do tempdb (database_id 2) diminuem emsys.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
- Microsoft Learn: Server memory configuration options
- Microsoft Learn: max degree of parallelism
- Microsoft Learn: tempdb database
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.
