AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 107808
Accepted
Geoff Patterson
Geoff Patterson
Asked: 2015-07-23 11:48:14 +0800 CST2015-07-23 11:48:14 +0800 CST 2015-07-23 11:48:14 +0800 CST

Diretrizes para manutenção do índice de texto completo

  • 772

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 AUTOalteraçõ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:

insira a descrição da imagem aqui

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.

sql-server full-text-search
  • 1 1 respostas
  • 9892 Views

1 respostas

  • Voted
  1. Best Answer
    Geoff Patterson
    2015-07-30T10:42:40+08:002015-07-30T10:42:40+08:00

    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

    insira a descrição da imagem aqui

    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.

    insira a descrição da imagem aqui


    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.

    -- Compute fragmentation information for all full-text indexes on the database
    SELECT c.fulltext_catalog_id, c.name AS fulltext_catalog_name, i.change_tracking_state,
        i.object_id, OBJECT_SCHEMA_NAME(i.object_id) + '.' + OBJECT_NAME(i.object_id) AS object_name,
        f.num_fragments, f.fulltext_mb, f.largest_fragment_mb,
        100.0 * (f.fulltext_mb - f.largest_fragment_mb) / NULLIF(f.fulltext_mb, 0) AS fulltext_fragmentation_in_percent
    INTO #fulltextFragmentationDetails
    FROM sys.fulltext_catalogs c
    JOIN sys.fulltext_indexes i
        ON i.fulltext_catalog_id = c.fulltext_catalog_id
    JOIN (
        -- Compute fragment data for each table with a full-text index
        SELECT table_id,
            COUNT(*) AS num_fragments,
            CONVERT(DECIMAL(9,2), SUM(data_size/(1024.*1024.))) AS fulltext_mb,
            CONVERT(DECIMAL(9,2), MAX(data_size/(1024.*1024.))) AS largest_fragment_mb
        FROM sys.fulltext_index_fragments
        GROUP BY table_id
    ) f
        ON f.table_id = i.object_id
    
    -- Apply a basic heuristic to determine any full-text indexes that are "too fragmented"
    -- We have chosen the 10% threshold based on performance benchmarking on our own data
    -- Our over-night maintenance will then drop and re-create any such indexes
    SELECT *
    FROM #fulltextFragmentationDetails
    WHERE fulltext_fragmentation_in_percent >= 10
        AND fulltext_mb >= 1 -- No need to bother with indexes of trivial size
    

    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.

    insira a descrição da imagem aqui


    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

    REBUILDAs ofertas e opções do SQL Server REORGANIZE, 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.

    • 40

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve