Pregunta

Tenemos un montón de consultas que "buscan" clientes, clientes, etc.Puede buscar por nombre, correo electrónico, etc.Estamos usando declaraciones LIKE de la siguiente manera:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

¿La indexación de texto completo ayuda en este escenario?Estamos usando SQL Server 2005.

¿Fue útil?

Solución

Dependerá de su DBMS.Creo que la mayoría de los sistemas no aprovecharán el índice de texto completo a menos que utilice las funciones de texto completo.(p.ej. PARTIDO CONTRA en mySQL o FREETEXT/CONTAINS en MS SQL)

Aquí hay un buen artículo sobre cuándo, por qué y cómo usar la indexación de texto completo en SQL Server: Comprender la indexación de texto completo de SQL Server

Otros consejos

FTS poder ayuda en este escenario, la pregunta es si vale la pena o no.

Para empezar, veamos por qué. LIKE Puede que no sea la búsqueda más eficaz.cuando usas LIKE, especialmente cuando estás buscando con un % Al comienzo de su comparación, SQL Server necesita realizar un escaneo de la tabla de cada fila. y una verificación byte a byte de la columna que está verificando.

FTS tiene algunos algoritmos mejores para hacer coincidir datos, al igual que algunas estadísticas mejores sobre variaciones de nombres.Por lo tanto, FTS puede proporcionar un mejor rendimiento para hacer coincidir a Smith, Smythe, Smithers, etc. cuando busca a Smith.

Sin embargo, es un poco más complejo utilizar FTS, ya que necesitarás dominar CONTAINS vs FREETEXT y el formato arcano de la búsqueda.Sin embargo, si desea realizar una búsqueda en la que FName o LName coincidan, puede hacerlo con una declaración en lugar de un OR.

Para determinar si FTS será efectivo, determine cuántos datos tiene.Utilizo FTS en una base de datos de varios cientos de millones de filas y eso es un beneficio real en comparación con la búsqueda con LIKE, pero no lo uso en todas las mesas.

Si el tamaño de su tabla es más razonable, menos de unos pocos millones, puede obtener una velocidad similar creando un índice para cada columna en la que va a buscar y SQL Server debería realizar un escaneo de índice en lugar de un escaneo de tabla.

Según mi escenario de prueba:

  • Servidor SQL 2008
  • 10.000.000 filas cada una con una cadena como "WordA WordB WordC ..." (varía entre 1 y 30 palabras)
  • seleccionando recuento(*) con CONTIENE(columna, "palabraB")
  • tamaño del resultado varios cientos de miles
  • tamaño del catálogo aproximadamente 1,8 GB

El índice de texto completo estaba en el rango de 2, mientras que como '% palabraB %' estuvo en el rango de 1-2 minutos.

¡Pero esto sólo cuenta si no utiliza ningún criterio de selección adicional! P.ej.si usé algunos "como 'prefijo%'" Además, en una columna de clave principal, el rendimiento fue peor ya que la operación de ingresar al índice de texto completo cuesta más que hacer una búsqueda de cadenas en algunos campos (siempre que no sean demasiado).

Entonces recomendaría el índice de texto completo. solo en los casos en los que tenga que hacer una "búsqueda de cadenas gratuita" o utilizar algunas de sus características especiales...

Para responder la pregunta específicamente para MSSQL, la indexación de texto completo NO ayuda en su escenario.

Para mejorar esa consulta, puede hacer una de las siguientes cosas:

  1. Configure un catálogo de texto completo en la columna y use la función CONTAINS().
  2. Si estaba buscando principalmente con un prefijo (es decir,coincide desde el principio del nombre), puede cambiar el predicado al siguiente y crear un índice sobre la columna.

    donde fname como 'prefijo%'

(1) probablemente sea excesivo para esto, a menos que el rendimiento de la consulta sea un gran problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top