Qual das seguintes consultas é mais rápida (LIKE x CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
ou
SELECT * FROM table WHERE Contains(Column, "test");
Qual das seguintes consultas é mais rápida (LIKE x CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
ou
SELECT * FROM table WHERE Contains(Column, "test");
Respostas:
O segundo (supondo que você queira dizer CONTAINSe, na verdade, coloque-o em uma consulta válida) deve ser mais rápido, pois pode usar alguma forma de índice (nesse caso, um índice de texto completo). Obviamente, essa forma de consulta estará disponível apenas se a coluna estiver em um índice de texto completo. Caso contrário, apenas o primeiro formulário estará disponível.
A primeira consulta, usando LIKE, não poderá usar um índice, pois começa com um curinga, portanto sempre exigirá uma verificação completa da tabela.
A CONTAINSconsulta deve ser:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS? E daí? A forma original da pergunta Column CONTAIN("%test%",Column)>0não era nem de longe válida. Ainda não está completamente certo.
Depois de executar as duas consultas em uma instância do SQL Server 2012, posso confirmar que a primeira consulta foi mais rápida no meu caso.
A consulta com a LIKEpalavra - chave mostrou uma verificação de índice em cluster.
O CONTAINStambém tinha uma verificação de índice em cluster com operadores adicionais para o jogo de texto completo e uma junção por mesclagem.

LIKEconsulta com um curinga principal não poderá usar a parte do índice com eficiência. Será necessário apenas verificar a coisa toda. Embora, sem dúvida, possa haver algumas circunstâncias em que a verificação completa do IC tenha um desempenho melhor do que uma consulta usando o índice de texto completo (talvez se uma proporção muito alta de linhas corresponder, por exemplo), isso será uma exceção em grande parte, e não uma regra geral que você "possa confirmar "
LIKE.
Eu acho que CONTAINSdemorou mais e usado Mergeporque você teve um traço ("-") na sua consultaadventure-works.com .
O traço é uma palavra de interrupção para que o CONTAINSíndice de texto completo adventureseja pesquisado works.come, em seguida, pesquisado e mesclado os resultados.
Tente também mudar disso:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Para isso:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
O primeiro encontrará registros com valores como " este é um teste " e " um caso de teste é o plano ".
O último também encontrará registros com valores como " estou testando isso " e " este é o melhor ".
CONTAINS, ele menciona apenas o uso de termos de prefixo como 'test *', não termos de sufixo como ' test' e não busca de substring completo como '* test '. Eu ainda não tentei.