¿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
CONTAINS
consulta debe ser:fuente
CONTAINS
? ¿Lo que de ella? La forma original de la pregunta teníaColumn CONTAIN("%test%",Column)>0
cuá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
LIKE
palabra clave mostró un escaneo de índice agrupado.El
CONTAINS
también tuvo un recorrido de índice agrupado con los operadores adicionales para la coincidencia de texto completo y una combinación de mezcla.fuente
LIKE
consulta 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
CONTAINS
tomó más tiempo y se usóMerge
porque tenía un guión ("-") en su consultaadventure-works.com
.El guión es una palabra clave, por lo que
CONTAINS
buscó el índice de texto completoadventure
y luego buscóworks.com
y 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.