¿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");
¿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");
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:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? ¿Lo que de ella? La forma original de la pregunta tenía Column 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.
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 consulta adventure-works.com
.
El guión es una palabra clave, por lo que CONTAINS
buscó el índice de texto completo adventure
y luego buscó works.com
y fusionó los resultados.
También intente cambiar 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 ".
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.