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");
sql-server
performance
contains
sql-like
user667429
fonte
fonte
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:fonte
CONTAINS
? E daí? A forma original da perguntaColumn 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.fonte
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 usadoMerge
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 completoadventure
seja pesquisadoworks.com
e, em seguida, pesquisado e mesclado os resultados.fonte
Tente também mudar disso:
Para isso:
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 ".
fonte
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.