Eu tenho lido alguns ótimos artigos sobre o cache do plano do SQL Server por Kimberly Tripp, como este: http://www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/
Por que existe até mesmo uma opção para "otimizar para cargas de trabalho ad hoc"? Isso não deveria estar sempre ligado? Independentemente de os desenvolvedores estarem usando SQL ad-hoc ou não, por que você não teria essa opção habilitada em todas as instâncias que a suportam (SQL 2008+), reduzindo assim o inchaço do cache?
A equipe de desenvolvimento do SQL Server trabalha com o princípio da menor surpresa - portanto, o SQL Server geralmente tem novos recursos desabilitados para manter o comportamento das versões anteriores.
Sim, otimizar para cargas de trabalho adhoc é ótimo para reduzir o inchaço do cache do plano - mas sempre teste-o primeiro!
Kalen Delaney conta uma história interessante de que ela perguntou a um de seus amigos engenheiros da Microsoft se haveria circunstâncias em que não seria apropriado habilitar isso. Ele volta vários dias depois para dizer - imagine um aplicativo que tenha muitas consultas diferentes e cada consulta seja executada exatamente duas vezes no total. Então pode ser inadequado. Basta dizer que não há muitos aplicativos como esse!
Se a maioria de suas consultas for executada mais de uma vez (não exatamente duas); provavelmente seria inadequado. A regra geral seria ativá-lo se houver muitas consultas ad hoc de uso único no banco de dados; no entanto, ainda não existem muitos aplicativos como esse.
Abaixo está um pequeno código que o ajudará a decidir se "ativar /desativar a otimização para cargas de trabalho ad hoc " será benéfico ou não. Normalmente verificamos isso como parte de nossa verificação de integridade para servidores internos e clientes.
É a opção mais segura para habilitar e é bem descrita por Brad aqui e por Glenn Berry aqui .
Ao ativar a opção " Otimizar para cargas de trabalho ad hoc ", você fará com que as consultas ad-hoc executadas na 2ª vez sejam tão lentas quanto na 1ª, porque você estará compilando um plano de execução e puxando os mesmos dados ( sem ele armazenado em cache) nas primeiras 2 vezes.
Isso pode não ser grande coisa, mas você notará isso ao testar as consultas.
Então, o que acontece agora, sem essa opção ativada e um cache cheio de consultas 1-Off Ad-Hoc?
O algoritmo de gerenciamento de cache:
À medida que esse recurso de Otimização foi introduzido, o algoritmo de gerenciamento de cache também foi atualizado.
O artigo de Kimberly Tripp também faz referência ao post de Kalen Delaney sobre essa mudança de algoritmo.
Ela explica melhor:
Isso significa que esses planos irritantes serão os primeiros a desaparecer quando você precisar liberar recursos.
Então agora a pergunta se torna:
" Por que PRECISAMOS de 'Otimizar para Cargas de Trabalho Ad Hoc' quando o SQL Server cuida da remoção de planos não utilizados quando necessário? "
-hoc, então faz todo o sentido ativar esse recurso.
Você deseja evitar sobrecarregar os recursos do sistema, de modo que force a remoção do plano/dados em cache depois de usar o espaço máximo de memória do cache.
Como sei quando preciso ativar isso?
Aqui está uma consulta que escrevi para mostrar quantos Planos Ad-Hoc você atualmente armazenou em cache e quanto espaço em disco eles estão consumindo (os resultados mudarão ao longo do dia - portanto, teste-o durante um período de carga pesada):
Resultados:
Não vou dizer " Quando você tiver X MB " ou " Se X% do seu Ad Hoc for de uso único " para ativar isso.
Não afeta Sprocs, Triggers, Views ou SQL Parametrizado/Preparado - apenas as consultas Ad-Hoc.
Minha recomendação pessoal é apenas ativar em seu ambiente de desenvolvimento, mas considere deixá-lo desativado em seu ambiente de desenvolvimento.
Digo isso apenas para o Dev, porque se você estiver otimizando uma consulta que leva um minuto ou mais para ser executada, você não deseja executá-la 3 vezes antes de ver o quão rápido ela será com ela armazenada em cache - a cada única vez que você o edita para encontrar o melhor design de otimização.
Se o seu trabalho não envolve fazer isso o dia todo, enlouqueça e peça ao seu DBA para ativá-lo em todos os lugares.
Pense em um servidor de produção que atende apenas 5 consultas diferentes, mas vários milhares delas por segundo. Você é a equipe de desenvolvimento do Microsoft SQL Server. Você vai mexer com o cache do plano. Você ativa esse comportamento por padrão, quando sabe que alguns de seus maiores e mais críticos clientes (por exemplo, implementação SAP interna da Microsoft) trabalham no mesmo campus e usam a mesma cafeteria que você?
"Por que NÃO devo usar..." No decorrer de algumas investigações de desempenho, retirar os planos do cache de planos quase em tempo real, enquanto observa a utilização dos recursos, pode ser muito útil. "Otimizar para cargas de trabalho adhoc" pode atrapalhar isso, pois os planos de stub adhoc não retornarão um plano ao consultar o cache. Em um caso como esse, se a consulta e o plano não puderem ser identificados, a configuração poderá ser desativada e ativada novamente para fins de investigação. Observe que uma alteração na configuração afeta as consultas compiladas desse ponto em diante. Além disso, sempre que alterar uma propriedade de 'servidor', verifique uma instância não-prod na mesma versão para verificar se a alteração liberará ou não o cache do plano. Eu pessoalmente odeio ser surpreendido por isso. (Por exemplo, alterar o maxdop no nível do servidor normalmente libera o cache do plano,
"O stub do plano compilado não tem um plano de execução associado a ele e a consulta do identificador do plano não retornará um XML Showplan." http://technet.microsoft.com/en-us/library/cc645587.aspx