Pergunta

Temos um monte de consultas que "procuram" clientes, clientes, etc.Você pode pesquisar por nome, email, etc.Estamos usando instruções LIKE da seguinte maneira:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

A indexação de texto completo ajuda nesse cenário?Estamos usando o SQL Server 2005.

Foi útil?

Solução

Dependerá do seu SGBD.Acredito que a maioria dos sistemas não aproveitará as vantagens do índice de texto completo, a menos que você use as funções de texto completo.(por exemplo. JOGO/CONTRA em mySQL ou FREETEXT/CONTAINS em MS SQL)

Aqui está um bom artigo sobre quando, por que e como usar a indexação de texto completo no SQL Server: Noções básicas sobre indexação de texto completo do SQL Server

Outras dicas

Serviço Fiscal Federal pode ajudar nesse cenário, a questão é se vale a pena ou não.

Para começar, vamos ver por que LIKE pode não ser a pesquisa mais eficaz.Quando você usa LIKE, especialmente quando você está pesquisando com um % no início da comparação, o SQL Server precisa executar uma verificação de tabela de cada linha e uma verificação byte por byte da coluna que você está verificando.

O FTS tem alguns algoritmos melhores para combinar dados, assim como algumas estatísticas melhores sobre variações de nomes.Portanto, o FTS pode fornecer melhor desempenho para combinar Smith, Smythe, Smithers, etc. quando você procura por Smith.

No entanto, é um pouco mais complexo usar o FTS, pois você precisará dominar CONTAINS contra FREETEXT e o formato misterioso da pesquisa.No entanto, se quiser fazer uma pesquisa onde FName ou LName correspondam, você pode fazer isso com uma instrução em vez de um OR.

Para determinar se o FTS será eficaz, determine quantos dados você possui.Eu uso o FTS em um banco de dados de centenas de milhões de linhas e isso é um benefício real em relação à pesquisa com LIKE, mas não o uso em todas as mesas.

Se o tamanho da sua tabela for mais razoável, inferior a alguns milhões, você poderá obter velocidade semelhante criando um índice para cada coluna que irá pesquisar e o SQL Server deverá executar uma verificação de índice em vez de uma verificação de tabela.

De acordo com meu cenário de teste:

  • Servidor SQL 2008
  • 10.000.000 linhas cada uma com uma string como "worda wordb wordc ..." (varia entre 1 e 30 palavras)
  • selecionando contagem(*) com CONTAINS(coluna, "palavraB")
  • tamanho do resultado várias centenas de milhares
  • tamanho do catálogo aproximadamente 1,8 GB

O índice de texto completo estava na faixa de 2s, enquanto como '% palavraB %' estava no intervalo de 1-2 minutos.

Mas isto só conta se você não usar nenhum critério de seleção adicional! Por exemplo.se eu usasse algum "como 'prefixo%'" Além disso, em uma coluna de chave primária, o desempenho foi pior, pois a operação de acessar o índice de texto completo custa mais do que fazer uma pesquisa de string em alguns campos (desde que não sejam muito).

Então, eu recomendaria um índice de texto completo apenas nos casos em que você precisa fazer uma "pesquisa gratuita de strings" ou usar alguns de seus recursos especiais...

Para responder à pergunta especificamente para MSSQL, a indexação de texto completo irá NÃO ajuda no seu cenário.

Para melhorar essa consulta, você pode fazer o seguinte:

  1. Configure um catálogo de texto completo na coluna e use a função CONTAINS().
  2. Se você estivesse pesquisando principalmente com um prefixo (ou seja,correspondente desde o início do nome), você pode alterar o predicado para o seguinte e criar um índice sobre a coluna.

    onde fname gosta de 'prefix%'

(1) provavelmente é um exagero, a menos que o desempenho da consulta seja um grande problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top