Inicial > Não categorizado > Plano de manutenção, REINDEX VS Estatisticas

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

Categorias:Não categorizado
  1. Fabrício
    26 de maio de 2010 às 10:14

    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?

  2. Junior
    27 de maio de 2010 às 8:54

    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

  3. Fabiano Neves
    27 de maio de 2010 às 10:13

    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

  4. Junior
    28 de maio de 2010 às 8:35

    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

  5. Fabrício
    29 de maio de 2010 às 10:58

    "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

  6. nanelp
    10 de novembro de 2015 às 10:49

    Pensava que o ALTER TABLE nometabela REBUILD atualizava, testei aqui e vi que não ;(.Ótimo post, obrigada.

  1. No trackbacks yet.

Deixe uma resposta para Fabrício Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: