Eu estive no curso MS10775A na semana passada e uma pergunta que o treinador não conseguiu responder com segurança foi:
Um re-índice atualiza as estatísticas?
Encontramos discussões on-line argumentando que isso acontece e o que não acontece.
sql-server
index
sql-server-2012
index-tuning
statistics
Thor Erik
fonte
fonte
REINDEX
atualização das estatísticas da coluna é um efeito colateral da reconstrução do índice - você não precisa atualizar as estatísticas. Os dados na tabela não são alterados. São os mesmos dados, apenas a) mudou sua localização na bandeja giratória (quando uma página é reorganizada) ou b) em uma página diferente (no caso de uma recriação). Assim: a re-index faz (alguns) atualizar estatísticas: não há necessidade de fazê-lo.Respostas:
Lembre-se do seguinte ao se importar com a atualização de estatísticas (copiada de Reconstruindo índices versus Atualizando estatísticas (Benjamin Nevarez)
Por padrão, a
UPDATE STATISTICS
instrução usa apenas uma amostra de registros da tabela. UsarUPDATE STATISTICS WITH FULLSCAN
irá verificar a tabela inteira.Por padrão, a
UPDATE STATISTICS
instrução atualiza as estatísticas do índice e da coluna. O uso daCOLUMNS
opção atualizará apenas as estatísticas da coluna. O uso daINDEX
opção atualizará apenas as estatísticas do índice.A reconstrução de um índice , por exemplo, usando
ALTER INDEX … REBUILD
também atualizará as estatísticas do índice com o equivalente a usarWITH FULLSCAN
, a menos que a tabela seja particionada; nesse caso, as estatísticas serão apenas amostradas (se aplica ao SQL Server 2012 e posterior).As estatísticas criadas manualmente usando
CREATE STATISTICS
não são atualizadas por nenhumaALTER INDEX ... REBUILD
operação, inclusiveALTER TABLE ... REBUILD
.ALTER TABLE ... REBUILD
atualiza estatísticas para o índice em cluster, se um estiver definido na tabela que está sendo reconstruída.Reorganizar um índice , por exemplo, usar
ALTER INDEX … REORGANIZE
não atualiza nenhuma estatística.A resposta curta é que você precisa usar
UPDATE STATISTICS
para atualizar as estatísticas da coluna e que uma reconstrução do índice atualizará apenas as estatísticas do índice. Você pode forçar uma atualização para todas as estatísticas em uma tabela, incluindo estatísticas de índice e estatísticas criadas manualmente, com aUPDATE STATISTICS (tablename) WITH FULLSCAN;
sintaxe.O código a seguir ilustra as regras encapsuladas acima:
Primeiro, criaremos uma tabela com algumas colunas e um índice em cluster:
Esta consulta mostra a data em que cada objeto de estatísticas foi atualizado pela última vez:
Os resultados mostram que ainda não houve atualizações, o que está correto desde que criamos a tabela:
Vamos reconstruir a tabela inteira e ver se isso atualiza as estatísticas:
Os resultados mostram que apenas as estatísticas do índice clusterizado foram atualizadas.
Em seguida, realizamos uma
UPDATE STATS
operação discreta :Como você pode ver, acabamos de atualizar as estatísticas na
d
coluna:Agora, atualizaremos as estatísticas em toda a tabela:
Como você pode ver, a única maneira de garantir que todas as estatísticas sejam atualizadas é atualizando cada uma manualmente ou com a tabela inteira
UPDATE STATISTICS (table);
.fonte
ALTER INDEX ... REBUILD
umaUPDATE STATISTICS
declaração ou de uma . Se a tabela em si for reconstruída, apenas as estatísticas do índice em cluster serão atualizadas. Para sua informação, uma chave primária e um índice em cluster não são necessariamente suportados pelo mesmo objeto de índice.A página Microsoft Docs para estatísticas do SQL Server afirma :
fonte