Plano de manutenção, REINDEX VS Estatisticas
Hoje conversando com meu amigo truquêro Laerte Junior, surgiu uma dúvida,
Se eu tenho uma rotina de manutenção que faz o REBUILD de todos os índices que existem no banco de dados, mesmo assim eu preciso atualizar as estatísticas das tabelas?
Sabemos que eu posso criar estatísticas sobre uma determinada coluna manualmente utilizando o comando CREATE STATISTICS, e o SQL pode criar uma estatística (aquelas que começam com “_WA_Sys_”) sobre uma coluna automaticamente caso o parâmetro de auto create statistics estiver ligado.
Melhorando a pergunta. Após terminar de rodar o REBUILD, o SQL terá atualizado todas as estatísticas das tabelas? Inclusive esta criadas automaticamente pelo SQL?
Resposta rápida: Depende J
Vou resumir pra não perder muito tempo.
Se sua rotina utiliza o comando ALTER INDEX <ALGUMINDICE> ON <TABELA> REBUILD, então SIM você precisa atualizar as estatísticas que não pertencem aos índices.
Se sua rotina utiliza o comando ALTER INDEX ALL ON <TABELA> REBUILD, então SIM você precisa atualizar as estatísticas que não pertencem aos índices.
Se sua rotina utiliza o comando DBCC DBREINDEX(<TABELA>, <ALGUMINDICE>), então SIM você precisa atualizar as estatísticas que não pertencem aos índices.
E por fim, se sua rotina utiliza o comando DBCC DBREINDEX(<TABELA>), então NÃO você não precisa atualizar as estatísticas, pois o SQL irá atualizar todas as estatísticas pra você.
Segue um exemplo do que eu falei.
select name, Stats_date(id, indid) DataAtualizacao
from sysindexes
where id = Object_id(‘<tabela>’)
/*
name DataAtualizacao
XPKTabela 2009-08-05 10:37:05.467
ix_Coluna 2009-08-05 10:37:05.513
_WA_Sys_ID_Pessoa_0DFC52CF 2009-08-05 10:37:05.527
_WA_Sys_ID_Endereco_0DFC52CF 2009-08-05 10:37:05.527
*/
— Se você especificar um índice, ele só atualiza estatistica deste índice
DBCC DBREINDEX (‘<tabela>’, XPKTabela)
/*
name DataAtualizacao
XPKTabela 2010-05-25 14:20:52.637 — ATUALIZOU O INDICE
ix_Coluna 2009-08-05 10:37:05.513
_WA_Sys_ID_Pessoa_0DFC52CF 2009-08-05 10:37:05.527
_WA_Sys_ID_Endereco_0DFC52CF 2009-08-05 10:37:05.527
*/
— Se você NÃO especificar um índice, ele atualiza estatistica de todos os índices e estatisticas
DBCC DBREINDEX (‘<tabela>’)
/*
name DataAtualizacao
XPKTabela 2010-05-25 14:25:16.733 — ATUALIZOU TUDO
ix_Coluna 2010-05-25 14:25:17.070 — ATUALIZOU TUDO
_WA_Sys_ID_Pessoa_0DFC52CF 2010-05-25 14:25:15.127 — ATUALIZOU TUDO
_WA_Sys_ID_Endereco_0DFC52CF 2010-05-25 14:25:15.140 — ATUALIZOU TUDO
*/
— Se você usar o ALTER INDEX REBUILD passando um índice ele só atualiza as estatisticas deste índice
ALTER INDEX XPKTabela ON <tabela> REBUILD
/*
name DataAtualizacao
XPKTabela 2010-05-25 14:26:07.607 — ATUALIZAOU O INDICE
ix_Coluna 2010-05-25 14:25:17.070
_WA_Sys_ID_Pessoa_0DFC52CF 2010-05-25 14:25:15.127
_WA_Sys_ID_Endereco_0DFC52CF 2010-05-25 14:25:15.140
*/
— Se você usar o ALTER INDEX REBUILD passando ALL ele só atualiza dos índices e não das estatisticas
ALTER INDEX ALL ON <tabela> REBUILD
/*
name DataAtualizacao
XPKTabela 2010-05-25 14:27:14.517 — ATUALIZAOU SÓ OS INDICES
ix_Coluna 2010-05-25 14:27:14.617 — ATUALIZAOU SÓ OS INDICES
_WA_Sys_ID_Pessoa_0DFC52CF 2010-05-25 14:25:15.127
_WA_Sys_ID_Endereco_0DFC52CF 2010-05-25 14:25:15.140
*/
Conclusão, como o DBCC DBREINDEX será removido do SQL, altere sua rotina de manutenção para usar o ALTER INDEX ALL REBUILD e crie outra rotina para rodar o UPDATE STATISTICS, ou então rode a sp_UpdateStats.
Abraços
Massa… Ja tinha passado por isso. Havia lido um post em algum lugar dizendo que não era necessário atualizar as estatísticas após o REBUILD, mas eu verifiquei que só as estatísticas dos índices eram atualizadas… Aproveitando o assunto:Para quem tem tabelas muito grandes e não possui uma boa janela para manutenção, não seria legal apenas atualizarmos as estatísticas que não são dos índices? Pois o comando UPDATE STATISTICS Table WITH FULLSCAN demora um bocado!Faria um select na tabela abaixo para selecionar somente as estatisticas necessasrias e depois um loop para atualizar as estatíticas:select name, Stats_date(id, indid) DataAtualizacaofrom sysindexeswhere id = Object_id(\’table\’)Acham que essa idéia é válida?
Fabiano primeiramente excelente suas paletras no Marilia TechDay. Meus Parabens.Tenho o seguinte Job que utilizo para manutencao das Estatisticas:set @comando1 = \’update statistics \’+@tabela + \’ with FULL\’exec (@comando1)set @comando2 = \’sp_recompile \’+@tabelaexec (@comando2)Estive analisando e o comando sp_UpdateStats acho que já faz o serviço completo né? O que me sugere?PS: o meu nível de compatibilidade é 80.Junior
Oi Junior, valeu.Seu comando é melhor que o sp_updateStats… pois ele atualiza com WITH FULLSCAN (acho qeu você escreveu errado é FULLSCAN e não FULL), o sp_updateStats atualiza com SAMPLE…Fabricio, eu acho importante que todas as estatisticas sejam atualizadas, inclusive as dos índices… no pior dos cenários você poderia atualizar com WITH SAMPLE..Abraços
Certo Fabiano, Então vou deixar esssa rotina, ficando outra pergunta quanto a sp_recompile, sempre executo ela após a rotina, é recomendado? Lembrando que utilizo o SQL 2005 e 2008 porém ambos na compatibilidade 80.A proposito nessa mesma rotina utilizo para Desfragmentar os índices:set @comando = \’ALTER INDEX \’+ @indice +\’ ON \’ + @tabela + \’ REORGANIZE \’ (para indices com fragmentacao abaixo de 30%) e set @comando = \’ALTER INDEX \’+ @indice +\’ ON \’ + @tabela + \’ REBUILD WITH (ONLINE = OFF) \’ (para indices com fragmentacao acima de 30%)É o melhor comando ra manter os índices fragmentados? ou já temos comados mais completos?Junior
"Fabricio, eu acho importante que todas as estatisticas sejam atualizadas, inclusive as dos índices… no pior dos cenários você poderia atualizar com WITH SAMPLE.."A minha idéia era dar um REBUILD em todos os indices de uma tabela e em seguida atualizar as estatisticas dessa tabela…Só que como as estatísticas dos índices acabaram de ser atualizadas no REBUILD não seria necessário atualiza-las novamente no UPDATE STATISTICS… Apenas as outras estatísticas da tabela…Para uma tabela muito grande, penso que poderia reduzir o tempo do Update Statistics.. Mas tenho que testar para ver se faz muita diferença…Valeu
Pensava que o ALTER TABLE nometabela REBUILD atualizava, testei aqui e vi que não ;(.Ótimo post, obrigada.