Como o vs contém no servidor SQL

Qual das seguintes consultas é mais rápida (como o vs contém)?

SELECT * FROM table WHERE Column LIKE '%test%';

ou

SELECT * FROM table WHERE Contains(Column, "test");
Author: Aldwoni, 2011-09-22

5 answers

O segundo (supondo que você significa CONTAINS, e realmente colocá-lo em uma consulta válida) deve ser mais rápido, porque ele pode usar alguns forma de índice (neste caso, um índice de texto completo). Claro que esta forma de consulta só está disponível SE a coluna estiver num índice de texto completo. Se não for, então só o primeiro formulário está disponível.

A primeira consulta, usando o tipo, será incapaz de usar um índice, uma vez que começa com um carácter especial, pelo que irá necessitar sempre de uma tabela completa digitalizar.


A consulta CONTAINS deve ser:

SELECT * FROM table WHERE CONTAINS(Column, 'test');
 129
Author: Damien_The_Unbeliever, 2011-09-22 06:49:09

Contém procura por correspondência precisa ou difusa (menos precisa) com palavras e frases únicas, palavras a uma certa distância umas das outras, ou correspondências ponderadas no servidor SQL.

Contém pode procurar por:

  1. uma palavra ou frase.
  2. o prefixo de uma palavra ou frase.
  3. Uma palavra perto de outra palavra.
  4. uma palavra gerada inflectivamente a partir de outra (por exemplo, a palavra drive é a haste inflectional de drives, drives, condução, e basear).
  5. uma palavra que é sinônimo de outra palavra usando um thesaurus (por exemplo, a palavra "metal" pode ter sinônimos como "alumínio" e "aço").

Nota: contém é mais rápido e funcionará se existir um índice de texto completo actualizado. Se quiser uma expressão regular exacta, poderá usar a expressão "like".

 17
Author: Somnath Muluk, 2016-08-23 12:16:39

Tendo executado ambas as consultas em uma instância SQL Server 2012, posso confirmar que a primeira consulta foi mais rápida no meu caso.

A pesquisa com a palavra-chave LIKE mostrou uma pesquisa de índice agrupada.

O CONTAINS também tinha uma varredura de índice agrupada com operadores adicionais para a correspondência de texto completo e uma junção de junção.

Plan

 13
Author: MI C, 2014-03-01 20:38:12

Eu acho que {[[0]} levou mais tempo e usou {[[1]} porque você tinha um traço (" - " ) em sua consulta {[[2]}.

O traço é uma palavra de ruptura, por isso o CONTAINS procurou o índice de texto completo de adventure e depois procurou por works.com e fundiu os resultados.

 5
Author: Omri Valfer, 2015-05-29 09:00:45

Tente também mudar disto:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

Para isto:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

O primeiro irá encontrar registos com valores como " Este é um teste " e " um teste-caso é o plano ".

Este último também encontrará registos com valores como" estou a testar este "e"Este é o maior".

 3
Author: John Doe, 2015-11-18 13:01:04