O tempo necessário para a reconstrução do índice depende do nível de fragmentação?
A reconstrução de um índice fragmentado de 80% leva aproximadamente 2 minutos se a reconstrução do mesmo índice fragmentado 40% leva 1 minuto?
Estou solicitando o RUNTIME (por exemplo, em segundos) que pode ser necessário para executar a ação necessária, e não sobre qual ação é necessária em que situação específica. Estou ciente das práticas recomendadas básicas quando o reorganização do índice ou atualizações de reconstrução / estatística devem ser feitas.
Esta pergunta NÃO faz perguntas sobre o REORG e a diferença entre REORG e REBUILD.
Antecedentes: devido à configuração de diferentes trabalhos de manutenção de índice (todas as noites, trabalho mais pesado nos finais de semana ...), eu me perguntava se um trabalho de manutenção de índice OFF-LINE diário "leve a intenso" deveria ser melhor executado em índices fragmentados de média baixa para manter o fora do horário de trabalho pequeno - ou isso não importa e a reconstrução em um índice fragmentado de 80% pode demorar o mesmo tempo de folga que a mesma operação no mesmo índice fragmentado de 40%.
Segui as sugestões e tentei descobrir o que estava acontecendo. Minha configuração experimental: em um servidor de teste que não faz mais nada e não está sendo usado por ninguém, criei uma tabela com um Índice de Cluster em uma coluna de chave primária de identificador exclusivo com algumas colunas adicionais e tipos de dados diferentes [2 numéricos, 9 datetime e 2 varchar (1000)] e simplesmente adicionou linhas. Para o teste apresentado, adicionei cerca de 305.000 linhas.
Em seguida, usei um comando de atualização e atualizei aleatoriamente um intervalo de linhas filtrando um valor inteiro e alterei uma das colunas VarChar com um valor de sequência variável para criar fragmentação. Depois disso, verifiquei o avg_fragmentation_in_percent
nível atual sys.dm_db_index_physical_stats
. Sempre que criei uma "nova" fragmentação para o meu benchmark, adicionei esse valor incluindo o physical_page_count
valor para minhas gravações do qual é feito o diagrama a seguir.
Então eu corri: Alter index ... Rebuild with (online=on);
e peguei CPU time
usando STATISTICS TIME ON
minhas gravações.
Minhas expectativas: esperava ver pelo menos a indicação de um tipo de curva linear que mostrasse uma dependência entre o nível de fragmentação e o tempo da CPU.
Este não é o caso. Não tenho certeza se esse procedimento é realmente apropriado para um bom resultado. Talvez o número de linhas / páginas seja muito baixo?
No entanto, os resultados indicam que a resposta à minha pergunta original definitivamente seria NÃO . Parece que o tempo de CPU necessário para o SQL Server reconstruir o índice não depende do nível de fragmentação nem da contagem de páginas do índice subjacente.
O primeiro gráfico mostra o tempo de CPU necessário para recompilar o índice em comparação com o nível de fragmentação anterior. Como você pode ver, a linha média é relativamente constante e não existe uma relação entre fragmentação e tempo de CPU necessário observável.
Para respeitar a possível influência da alteração do número de páginas no índice após minhas atualizações que podem exigir mais ou menos tempo para serem reconstruídas, calculei o NÍVEL DE FRAGMENTAÇÃO * CONTAGEM DE PÁGINAS e usei esse valor no segundo gráfico que mostra a relação do tempo de CPU necessário vs. fragmentação e contagem de páginas.
Como você pode ver, isso também não indica que o tempo necessário para reconstruir é influenciado pela fragmentação, mesmo que o número de páginas varie.
Depois de fazer essas declarações, acho que meu procedimento deve estar errado, porque o tempo de CPU necessário para reconstruir um índice enorme e altamente fragmentado pode ser influenciado apenas pelo número de linhas - e eu realmente não acredito nessa teoria.
Então, porque eu realmente e definitivamente quero descobrir isso agora, quaisquer outros comentários e recomendações são muito bem-vindos .
Para todos os interessados, criei um gráfico mostrando a duração do índice REBUILD de cerca de 2500 reconstruções de índice em algumas semanas em relação à fragmentação do índice e seu tamanho em páginas.
Esses dados são baseados em 10 servidores SQL, centenas de tabelas e nos procedimentos de otimização de Ola Hallengren . O limite geral para reconstrução é definido como 5% de fragmentação.
Cortei algumas das maiores tabelas (10 Mi + Pages) nessas estatísticas para torná-las mais legíveis.
O gráfico mostra o tempo necessário (duração) como tamanho das bolhas. Os valores da maior bolha são de cerca de 220 segundos. Isso mostra que o tempo necessário para reconstruir um índice não está realmente relacionado à fragmentação. Em vez disso, parece depender mais do número de páginas que o índice possui. Também indica que a fragmentação de baixo nível consome mais tempo que a fragmentação mais alta.
O segundo gráfico é ampliado apenas na área <= 200 K páginas. Mostra o mesmo, leva mais tempo para índices maiores, não para mais fragmentação.
fonte
REBUILD
do índice não depende da fragmentação. Ele descarta o índice completamente e o cria do zero.REORGANZE
índice - é para reduzir a fragmentação sem reconstruir o índice, portanto, não solte e crie.A MS recomenda o uso de Reorganizar para fragmentação de 30% ou menos. Para maior fragmentação, é preferível reconstruir.
Aqui está o artigo do MSDN sobre isso: Reorganizando e reconstruindo índices
ATUALIZAR
Em termos de tempo necessário para concluir a operação, obviamente depende da fragmentação do índice. A reconstrução de um índice extremamente fragmentado levará menos tempo do que a reorganização; reconstruir um índice ligeiramente fragmentado levará muito mais tempo. Eu sugeriria tomar as diretrizes da Microsoft como ponto de partida e executar alguns testes em suas tabelas. O ponto de equilíbrio em termos de% de fragmentação dependerá da tabela específica, tamanho do índice e tipo de dados.
fonte
O algoritmo para um REBUILD vs REORG é diferente. Um REORG NÃO alocará novas extensões em oposição a um RECONSTRUÍDO. Um REORG funcionará com as páginas alocadas atualmente (aloca uma página aleatória de 8 KB para que possa mover as páginas) e as move e depois desalocam as páginas, se necessário.
Das minhas anotações internas do SQLSkills (anteriormente IE0) ...
Para RECONSTRUIR:
Para o índice REORG:
Leia - Notas - Fragmentação, tipos e soluções de índice do SQL Server
fonte
Eu sei que é um tópico antigo, mas acho que será benéfico compartilhar o post de Paul Randal aqui.
https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/
fonte
Sim, porque geralmente uma reconstrução precisa varrer o índice original em ordem ao transmitir as linhas (em ordem) para uma nova partição de índice físico. A fragmentação afeta as verificações não armazenadas em cache; portanto, a reconstrução levará mais tempo.
Quanto tempo mais depende da fragmentação e de como a CPU vincula todo o processo. A serialização de linhas consome bastante CPU e, portanto, pode não ter importância. Ou você pode obter taxas aleatórias de E / S de 1,5 MB / s, o que é facilmente 5 a 10 vezes mais lento do que uma reconstrução rápida (depende do esquema e dos dados). Dependendo das premissas que você faz, você provavelmente pode inventar algo entre 1x e 100x de desaceleração.
Não é uma relação linear. A métrica fragmentação é um muito procuração áspera por quanto tempo que leva para fazer a varredura de uma partição.
fonte
CHECKPOINT; DBCC DROPCLEANBUFFERS
antes de cada teste. Também estou interessado em ver os resultados. Certa vez, fiz um teste semelhante em que medi a velocidade da digitalização, dependendo da fragmentação, mas não me lembro do resultado.