Estou tentando entender melhor (conceitualmente) o relacionamento entre estatísticas, planos de execução, execução de procedimentos armazenados.
Estou correto ao dizer que as estatísticas são usadas apenas ao criar o plano de execução para um procedimento armazenado e não são usadas no contexto de execução real? Em outras palavras, se isso for verdade, uma vez que o plano seja criado (e supondo que seja reutilizado adequadamente), qual a importância das estatísticas "atualizadas"?
Fiquei particularmente motivado por um artigo que li ( Estatísticas, estimativas de linha e coluna da data ascendente ), que descreve um cenário muito semelhante ao que eu enfrento diariamente em vários bancos de dados de nossos clientes.
Temos uma coluna de data / hora crescente em uma de nossas maiores tabelas que consultamos regularmente usando um procedimento armazenado específico.
Como você evita que os planos de execução se tornem obsoletos quando você adiciona cem mil linhas por dia?
Se estivermos atualizando estatísticas frequentemente para combater esse problema, faria sentido usar a dica OPTION (RECOMPILE) na consulta deste procedimento armazenado?
Qualquer conselho ou recomendação seria apreciado.
Atualização : estou usando o SQL Server 2012 (SP1).
fonte
RECOMPILE
não causaria uma atualização de estatísticas de qualquer maneira.Não, estatísticas desatualizadas podem causar uma recompilação relacionada à otimização da instrução afetada.
Os planos de execução abaixo do ideal, causados por valores predicados estarem fora (especificamente acima) do intervalo de valores armazenados no histograma estatístico correspondente, é conhecido como Problema Chave Ascendente . A reconstrução de estatísticas é uma solução possível, mas pode consumir muitos recursos. As alternativas incluem:
Rastrear sinalizadores 2389 e 2390 . Isso requer que exista um índice com a coluna problemática como chave principal. Ele não funciona com tabelas particionadas e só é eficaz no SQL Server 2014 se o estimador de cardinalidade original for usado. O sinalizador de rastreamento 4139 também pode ser necessário se o objeto de estatísticas tiver a marca estacionária.
Atualize para o SQL Server 2014. O novo estimador de cardinalidade inclui lógica para estimar além do histograma usando informações de densidade média. Isso pode ser menos preciso que os sinalizadores de rastreamento 2389/2390 em algumas circunstâncias importantes.
Ative atualizações automáticas de estatísticas mais frequentes para tabelas grandes com o sinalizador de rastreamento 2371 . Com esse sinalizador de rastreamento, em vez de atualizar após 20% + 500 alterações, são necessárias apenas
SQRT(1000 * Table rows)
modificações . Essa não é uma solução tão completa quanto as mencionadas anteriormente, pois as atualizações ainda podem não ser acionadas com bastante frequência.Se a origem do seu problema não for compilações de planos tão frequentes com base em valores predicados além do histograma, mas mais sobre os efeitos de armazenar em cache ocasionalmente um plano tão ruim como resultado da detecção de parâmetros, você também pode considerar:
OPTIMIZE FOR (@parameter = value)
para compilar um plano para um valor representativo conhecidoOPTIMIZE FOR (@parameter UNKNOWN)
para otimizar usando a distribuição médiaOPTIMIZE FOR UNKNOWN
(o mesmo que 4136, mas por consulta)OPTION (RECOMPILE)
para compilar todas as vezes, cheirando o valor específico. Se a grande maioria dos valores de tempo de execução estiver dentro do histograma, isso pode ser eficaz.Para obter mais informações sobre opções de sniffing, incorporação e recompilação de parâmetros, consulte meu artigo no SQLperformance.com.
fonte