LIKE vs CONTAINS en SQL Server

¿Cuál de las siguientes consultas es más rápida (LIKE vs CONTAINS)?

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

o

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

El segundo (suponiendo que usted quiere decir CONTAINS , y realmente lo pone en una consulta válida) debe ser más rápido, porque puede usar algún tipo de índice (en este caso, un índice de texto completo). Por supuesto, esta forma de consulta solo está disponible si la columna está en un índice de texto completo. Si no es así, solo está disponible la primera forma.

La primera consulta, utilizando LIKE, no podrá usar un índice, ya que comienza con un comodín, por lo que siempre requerirá un escaneo de tabla completo.


La consulta CONTAINS debe ser:

 SELECT * FROM table WHERE CONTAINS(Column, 'test'); 

CONTAINS Busca coincidencias precisas o difusas (menos precisas) con palabras y frases únicas, palabras dentro de una cierta distancia entre sí o coincidencias ponderadas en SQL Server.

CONTAINS puede buscar:

  1. Una palabra o frase
  2. El prefijo de una palabra o frase.
  3. Una palabra cerca de otra palabra.
  4. Una palabra generada a partir de otra fuente (por ejemplo, la unidad de palabra es la deriva de inflexión de las unidades, conducir, conducir e impulsar).
  5. Una palabra que es un sinónimo de otra palabra usando un diccionario de sinónimos (por ejemplo, la palabra “metal” puede tener sinónimos como “aluminio” y “acero”).

Nota: CONTAINS es más rápido y funcionará si hay un índice actualizado de texto completo. Si quieres una coincidencia de expresión regular exacta, puedes usar like.

Después de haber ejecutado ambas consultas en una instancia de SQL Server 2012, puedo confirmar que la primera consulta fue la más rápida en mi caso.

La consulta con la palabra clave LIKE mostró un análisis de índice agrupado.

El CONTAINS también tenía un escaneo de índice agrupado con operadores adicionales para la coincidencia de texto completo y una combinación de fusión.

Plan

Creo que CONTAINS tomó más tiempo y usó Merge porque tenía un guion (“-“) en su consulta adventure-works.com .

El dash es una palabra de works.com por lo que CONTAINS buscó en el índice de texto completo de adventure y que buscó en works.com y fusionó los resultados.

También intente cambiar de esto:

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

A esto:

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

El primero encontrará registros con valores como ” esto es una prueba ” y ” un caso de prueba es el plan “.

Este último también encontrará registros con valores como ” estoy probando esto ” y ” este es el mejor “.