Entendendo a configuração Optimize for Ad Hoc Workloads

DBA e Consultor de Banco de Dados

Entendendo a configuração Optimize for Ad Hoc Workloads

Tempo de leitura: 7 minutos

Fala pessoal!

Espero que estejam todos bem!

Hoje vamos mergulhar em uma das configurações mais subestimadas do SQL Server que pode literalmente dar um grande folego para o seu ambiente no gerenciamento de problemas de memória. Estamos falando do “Optimize for Ad Hoc Workloads”. Se você já teve dor de cabeça com plan cache inchado ou performance degradada por causa de consultas ad hoc, esse artigo é para você.

O que são consultas Ad Hoc?

Antes de entrarmos no assunto principal, vamos entender o que são essas famosas consultas ad hoc. O termo “ad hoc” vem do latim e significa “para este propósito específico”. No contexto do SQL Server, são consultas que:

  • São executadas dinamicamente (não são stored procedures)
  • Geralmente são executadas apenas uma vez ou raramente
  • Contêm valores literais hardcoded no código
  • São geradas por aplicações que constroem SQL dinamicamente

Exemplo comum de uma consulta ad hoc:

Cada vez que essa consulta é executada com um ID diferente, o SQL Server trata como uma consulta completamente nova!

– Tá Gustavo, mas qual problema isso pode gerar?

Toda vez que o SQL Server executa uma consulta, ele cria um plano de execução e armazena no plan cache para reutilização futura. Isso é ótimo para stored procedures e consultas parametrizadas, mas para consultas ad hoc talvez não seja necessário guardar o mesmo plano infinitas vezes.

Vamos ver na Prática

Imagine que você tem uma aplicação que gera consultas assim:

Para o SQL Server, cada uma dessas consultas é única e merece seu próprio plano de execução no cache. Se você tem 100.000 produtos, terá potencialmente 100.000 planos diferentes ocupando memória.

 

Optimize for Ad Hoc Workloads

O SQL Server 2008 introduziu uma feature muito importante. “Optimize for Ad Hoc Workloads”. Quando habilitada, essa configuração muda drasticamente como o SQL Server lida com consultas ad hoc.
Como Funciona?

 

Em vez de armazenar o plano completo na primeira execução, o SQL Server:

 

1. Primeira execução – Armazena apenas um “stub” (esqueleto) do plano
2. Segunda execução – Se a mesma consulta for executada novamente, substitui o stub pelo plano completo
3. Resultado – Economia massiva de memória para consultas que executam apenas uma vez

 

Verificando se você precisa dessa configuração no seu ambiente

 

Antes de sair habilitando tudo, vamos diagnosticar se você realmente precisa. Use este script para analisar seu plan cache:

 

Dica : Se consultas ad hoc representarem mais de 20-30% do seu plan cache, pode ser uma boa hora para habilitar o Optimize for Ad Hoc Workloads no seu ambiente.

 

Habilitando a Configuração

 

Via T-SQL

Via SQL Server Management Studio

  1. Clique com botão direito na instância do SQL Server.
  2. Vá em “Properties” → “Advanced”.
  3. Localize “Optimize for Ad Hoc Workloads”.
  4. Altere para “True”.

 

Demonstração Prática Antes e Depois

Vamos criar um cenário real para ver a diferença. Vou usar o banco AdventureWorks2016:

Cenário de Teste

 

Vamos fazer alguns testes

 

Sem Optimize for Ad Hoc Workloads:

Análise
  • Cada consulta ad hoc criou um plano completo
  • 105 planos diferentes ocupando 2MB de memória
  • Média de ~21KB por plano de execução

 

Com Optimize for Ad Hoc Workloads habilitado:

 

Agora limpe o cache novamente, habilite a configuração e rode o loop novamente.

Rode em seguida a seguinte query :

Análise

  • 15 Compiled Plans – Consultas que foram reutilizadas (executadas mais de uma vez)
  • 5 Compiled Plan Stubs – Consultas únicas (executadas apenas uma vez)
  • Stubs ocupando espaço mínimo – TotalSizeMB = 0
Conclusão do Teste
  • Stubs vs Planos Completos – Economia de ~21KB por consulta única
  • Impacto Real – Em ambientes com milhares de consultas ad hoc, isso pode representar GBs de economia
  • Eficiência – Apenas consultas reutilizadas mantêm planos completos

Monitorando Queries Ad hoc

Para manter o controle, utilize esta query para monitorar regularmente:

Identificando Compiled Plan Stubs

Quando a configuração estiver ativa, você verá entradas com “cacheobjtype = ‘Compiled Plan Stub'”:

 

Script de Diagnóstico Completo

 

Aqui está um script completo para ajudar no diagnóstico:

Conclusão

O Optimize for Ad Hoc Workloads é uma configuração que pode fazer uma diferença significativa na performance do seu SQL Server, especialmente em ambientes com muitas consultas dinâmicas. A economia de memória pode ser gigantesca dependendo do volume de queries ad hoc gerada pela sua aplicação. Já vi casos onde o plan cache reduziu de 2GB para 200MB.

E aí, já conhecia essa configuração? Conta nos comentários se já teve problemas com plan cache inflado e como resolveu.

Até a próxima pessoal.

 

Gustavo Larocca

Consultor SQL Server

Referências:

 

Deixe uma resposta

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.