A resposta de sp_BlitzErik atinge muitos pontos positivos, mas acho que não é por isso que você não deve usar a Pesquisa de texto completo. A pesquisa de texto completo não existe para fazer o que você pensa que faz. Não existe para pesquisar vários campos. Ele existe para vetorizar o conteúdo de palavras e fazer uso de dicionários, stubbing, lexers, gazetteers, eliminação de palavras interrompidas e vários outros truques, dos quais nenhum se aplica. Ou ainda não foi mostrado para aplicar.
Também não concordo com a solução, embora não tenha certeza de como fazer isso melhor no SQL Server. Vamos recriar seus dados para o PostgreSQL - também é muito mais fácil criar no PostgreSQL.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
Agora, o que você deseja é um tipo de enumeração,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Agora você reduziu as seqüências de caracteres para representações inteiras. Mas melhor ainda, você pode consultá-los como antes.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Isso tem o efeito.
- esconde o fato de que você é categorias são um tipo enumerado. Essa complexidade é encapsulada no tipo e oculta ao usuário.
- também coloca a manutenção nessas categorias no tipo.
- é padronizado.
- não aumenta o tamanho da linha.
Sem esses benefícios, você está basicamente tentando otimizar a comparação de cadeias. Mas, infelizmente, nem tenho certeza de como o sp_BlitzErik chega à resposta, conforme o código da sugestão,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Você pode reduzir os tokens para números inteiros usando uma enumeração, ou o método de rolagem manual sugerido por sp_BlitzErik, mas se você pode fazer o recolhimento, por que está fazendo o mesmo não-ancorado? Ou seja, se você sabe '% pasta%' é o símbolo 'pasta', por que você tem os %
dois lados dela. Sem '%', isso é uma verificação de igualdade e deve ser muito rápida, mesmo como texto.