Do MSDN :
" Operações de inserção ocorrem em colunas-chave ascendentes ou descendentes As
estatísticas em colunas-chave ascendentes ou descendentes, como IDENTITY ou colunas de carimbo de data / hora em tempo real, podem exigir atualizações de estatísticas mais frequentes do que o otimizador de consultas executa. As operações de inserção acrescentam novos valores às colunas ascendentes ou descendentes O número de linhas adicionadas pode ser muito pequeno para acionar uma atualização de estatísticas.Se as estatísticas não estiverem atualizadas e as consultas forem selecionadas das linhas adicionadas mais recentemente, as estatísticas atuais não terão estimativas de cardinalidade para esses novos valores. resultam em estimativas imprecisas de cardinalidade e desempenho lento da consulta.
Por exemplo, uma consulta que seleciona as datas mais recentes do pedido de vendas terá estimativas imprecisas de cardinalidade se as estatísticas não forem atualizadas para incluir estimativas de cardinalidade para as datas mais recentes do pedido de vendas.
Operações após a manutenção
Considere atualizar as estatísticas após executar procedimentos de manutenção que alteram a distribuição dos dados, como truncar uma tabela ou executar uma inserção em massa de uma grande porcentagem das linhas. Isso pode evitar atrasos futuros no processamento de consultas enquanto as consultas aguardam atualizações automáticas de estatísticas ".
Você pode usar "EXEC sp_updatestats" de tempos em tempos em seu sistema (agendado algum tempo) ou usar a função STATS_DATE em todos os objetos e ver quando suas estatísticas foram atualizadas na última vez e se houve muito tempo desde então, use UPDATE ESTATÍSTICAS para esse objeto em particular. Na minha experiência, mesmo com as estatísticas automáticas ativadas, ainda somos obrigados a atualizar as estatísticas periodicamente, devido a operações de inserção que não acionam a atualização automática.
Para adicionar meu código pessoal (usado em um trabalho semanal que cria instruções dinâmicas para atualização de estatísticas):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
Aqui eu recebo todos os objetos em que as estatísticas não foram atualizadas por mais de três meses ou, desde a última atualização, houve mais de 10% das linhas alteradas.
where col=(cast @var...)
) e@var
podem ser'%'
. Eu o herdei há uma ou duas semanas e preciso mantê-lo funcionando basicamente até que seja substituído. Obrigado pelo link, eu vou dar uma olhada.