¿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");
sql-server
performance
contains
sql-like
usuario667429
fuente
fuente

Respuestas:
El segundo (suponiendo que quiere decir
CONTAINS, y realmente ponerlo en una consulta válida) debería ser más rápido, ya que puede usar alguna forma 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 el primer formulario.La primera consulta, usando LIKE, no podrá usar un índice, ya que comienza con un comodín, por lo que siempre requerirá un escaneo completo de la tabla.
La
CONTAINSconsulta debe ser:fuente
CONTAINS? ¿Lo que de ella? La forma original de la pregunta teníaColumn CONTAIN("%test%",Column)>0cuál era en ninguna parte cerca de válida. Todavía no está del todo bien.Después de ejecutar 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
LIKEpalabra clave mostró un escaneo de índice agrupado.El
CONTAINStambién tuvo un recorrido de índice agrupado con los operadores adicionales para la coincidencia de texto completo y una combinación de mezcla.fuente
LIKEconsulta con un comodín inicial no podrá utilizar la parte de índice de manera eficiente. Tendrá que escanear todo. Aunque sin duda puede haber algunas circunstancias en las que el análisis de CI completo funciona mejor que una consulta que utiliza el índice de texto completo (tal vez si una proporción muy alta de filas coincide, por ejemplo), esta será en gran medida la excepción, no una regla general que pueda "confirmar ".LIKE.Creo que
CONTAINStomó más tiempo y se usóMergeporque tenía un guión ("-") en su consultaadventure-works.com.El guión es una palabra clave, por lo que
CONTAINSbuscó el índice de texto completoadventurey luego buscóworks.comy fusionó los resultados.fuente
También intente cambiar esto:
A esto:
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 ".
fuente
CONTAINS, solo menciona el uso de términos de prefijo como 'prueba *', no términos de sufijo como ' prueba' y no búsqueda de subcadena completa como '* prueba '. Sin embargo, no lo he probado.