Quais diretrizes devem ser consideradas para manter índices de texto completo?
Devo RECONSTRUIR ou REORGANIZAR o catálogo de texto completo (ver BOL )? O que é uma cadência de manutenção razoável? Que heurística (semelhante aos limites de fragmentação de 10% e 30%) poderia ser usada para determinar quando a manutenção é necessária?
(Tudo abaixo é simplesmente informação extra elaborando a questão e mostrando o que eu pensei até agora.)
Informações extras: minha pesquisa inicial
Existem muitos recursos sobre a manutenção do índice b-tree (por exemplo, esta questão , os scripts de Ola Hallengren e várias postagens de blog sobre o assunto em outros sites). No entanto, descobri que nenhum desses recursos fornece recomendações ou scripts para manter índices de texto completo.
Há documentação da Microsoft que menciona que desfragmentar o índice b-tree da tabela base e, em seguida, executar REORGANIZE no catálogo de texto completo pode melhorar o desempenho, mas não aborda nenhuma recomendação mais específica.
Também encontrei esta pergunta , mas ela é focada principalmente no rastreamento de alterações (como as atualizações de dados na tabela subjacente são propagadas no índice de texto completo) e não no tipo de manutenção agendada regularmente que pode maximizar a eficiência do índice.
Informações extras: testes básicos de desempenho
Este SQL Fiddle contém código que pode ser usado para criar um índice de texto completo com controle de AUTO
alterações e examinar o tamanho e o desempenho da consulta do índice à medida que os dados na tabela são modificados. Quando executo a lógica do script em uma cópia dos meus dados de produção (em oposição aos dados fabricados artificialmente no violino), aqui está um resumo dos resultados que estou vendo após cada etapa de modificação de dados:
Mesmo que as declarações de atualização neste script tenham sido bastante planejadas, esses dados parecem mostrar que há muito a ganhar com a manutenção regular.
Informações extras: Ideias iniciais
Estou pensando em criar uma tarefa noturna ou semanal. Parece que esta tarefa pode executar uma RECONSTRUÇÃO ou REORGANIZAÇÃO.
Como os índices de texto completo podem ser muito grandes (dezenas ou centenas de milhões de linhas), gostaria de poder detectar quando os índices no catálogo estão fragmentados o suficiente para justificar uma RECONSTRUÇÃO/REORGANIZAÇÃO. Estou um pouco incerto sobre o que a heurística pode fazer sentido para isso.
Não consegui encontrar nenhum bom recurso on-line, então fiz mais algumas pesquisas práticas e achei que seria útil postar o plano de manutenção de texto completo resultante que estamos implementando com base nessa pesquisa.
Nossa heurística para determinar quando a manutenção é necessária
Nosso principal objetivo é manter o desempenho consistente da consulta de texto completo à medida que os dados evoluem nas tabelas subjacentes. No entanto, por vários motivos, seria difícil lançar um conjunto representativo de consultas de texto completo em cada um de nossos bancos de dados todas as noites e usar o desempenho dessas consultas para determinar quando a manutenção é necessária. Portanto, procuramos criar regras práticas que possam ser calculadas muito rapidamente e usadas como uma heurística para indicar que a manutenção do índice de texto completo pode ser garantida.
Durante essa exploração, descobrimos que o catálogo do sistema fornece muitas informações sobre como qualquer índice de texto completo é dividido em fragmentos. No entanto, não há nenhum "% de fragmentação" oficial calculado (como há para índices de árvore b via sys.dm_db_index_physical_stats ). Com base nas informações do fragmento de texto completo, decidimos calcular nossa própria "% de fragmentação de texto completo". Em seguida, usamos um servidor de desenvolvimento para fazer repetidamente atualizações aleatórias de qualquer lugar entre 100 e 25.000 linhas por vez para uma cópia de 10 milhões de linhas de dados de produção, registrar a fragmentação de texto completo e executar uma consulta de texto completo de benchmark usando
CONTAINSTABLE
.Os resultados, conforme vistos nos gráficos acima e abaixo, foram muito esclarecedores e mostraram que a medida de fragmentação que criamos está altamente correlacionada com o desempenho observado. Como isso também está de acordo com nossas observações qualitativas na produção, isso é suficiente para nos sentirmos confortáveis usando a % de fragmentação como nossa heurística para decidir quando nossos índices de texto completo precisam de manutenção.
O plano de manutenção
Decidimos usar o código a seguir para calcular uma % de fragmentação para cada índice de texto completo. Quaisquer índices de texto completo de tamanho não trivial com fragmentação de pelo menos 10% serão sinalizados para serem reconstruídos por nossa manutenção noturna.
Essas consultas geram resultados como os seguintes e, nesse caso, as linhas 1, 6 e 9 seriam marcadas como muito fragmentadas para desempenho ideal porque o índice de texto completo tem mais de 1 MB e pelo menos 10% de fragmentação.
cadência de manutenção
Já temos uma janela de manutenção noturna e o cálculo da fragmentação é muito barato de calcular. Portanto, executaremos essa verificação todas as noites e, em seguida, executaremos apenas a operação mais cara de realmente reconstruir um índice de texto completo quando necessário com base no limite de fragmentação de 10%.
RECONSTRUIR x REORGANIZAR x DROP/CRIAR
REBUILD
As ofertas e opções do SQL ServerREORGANIZE
, mas estão disponíveis apenas para um catálogo de texto completo (que pode conter qualquer número de índices de texto completo) em sua totalidade. Por motivos herdados, temos um único catálogo de texto completo que contém todos os nossos índices de texto completo. Portanto, optamos por descartar (DROP FULLTEXT INDEX
) e recriar (CREATE FULLTEXT INDEX
) em um nível de índice de texto completo individual.Pode ser mais ideal dividir os índices de texto completo em catálogos separados de maneira lógica e executar um
REBUILD
, mas a solução drop/create funcionará para nós enquanto isso.