Eu tenho uma tabela bem básica:
CREATE TABLE [obj_local] (
[obj_id] INT NOT NULL,
[value] NVARCHAR (1000) NOT NULL
);
Esta tabela armazena muitos dados e preciso pesquisar na value
coluna uma sequência de caracteres:
SELECT [obj_id] FROM [obj_local] WHERE [value] LIKE '%{substring}%'
Isso é extremamente lento. Meu entendimento é que um índice não vai me ajudar devido aos curingas de ambos os lados, e um índice de texto completo também não vai me ajudar, porque não estou procurando tokens (palavras).
Há algo que eu possa fazer para otimizar essa pesquisa?
Se você souber a string exata, usar um agrupamento binário para sua pesquisa pode ajudar.
, porque não terá que fazer conversões de maiúsculas e minúsculas e coisas do tipo. Isso pode torná-lo algumas vezes mais rápido, mas não muito rápido.
Outra opção é explodir sua tabela e indexá-la - usando uma exibição indexada sobre um john entre uma tabela de números e sua tabela, aproveitando a função substring.
Por exemplo, se você tiver uma tabela com pelo menos 1.000 números, poderá criar uma linha para cada caractere. Sim, custará espaço, mas permitirá que você encontre rapidamente cada "H" lá dentro.
O problema é que ainda não é exatamente o que você precisa, porque haverá muitos "H"s. Talvez seja melhor pegar combinações de três letras. Portanto, se você está procurando por 'Hotel', sabe que "Hot", "ote" ou "tel" devem estar na tabela de combinação de três letras. Você pode criar uma função com valor de tabela embutida para lidar com isso. Naturalmente, quando você procura por "Hot", o próximo bloco para esse obj_id deve ser como 'el%', e assim por diante, além disso, você deve verificar se sua tabela principal ainda satisfaz com sucesso o predicado principal.
É uma ideia... se você aguentar a complexidade de contornar isso assim.