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 CONTAINS
e, 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 CONTAINS
consulta deve ser:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? E daí? A forma original da pergunta Column CONTAIN("%test%",Column)>0
nã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 LIKE
palavra - chave mostrou uma verificação de índice em cluster.
O CONTAINS
também tinha uma verificação de índice em cluster com operadores adicionais para o jogo de texto completo e uma junção por mesclagem.
LIKE
consulta 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 CONTAINS
demorou mais e usado Merge
porque 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 adventure
seja pesquisado works.com
e, 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.