2008-09-11 6 views
39

Tenemos un montón de consultas que "búsqueda" para los clientes, clientes, etc. Se puede buscar por nombre, correo electrónico, etc. Estamos utilizando como declaraciones de la siguiente manera:¿Cuándo debería usar la indexación de texto completo?

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

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

Respuesta

26

Depende de su DBMS. Creo que la mayoría de los sistemas no aprovecharán el índice de texto completo a menos que use las funciones de texto completo. (Por ejemplo MATCH/AGAINST en MySQL o FREETEXT/CONTIENE en MS SQL)

Aquí es un buen artículo sobre cuándo, por qué y cómo utilizar la indexación de texto completo en SQL Server: Understanding SQL Server Full-Text Indexing

3

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

Con el fin de mejorar la consulta que usted podría hacer uno de los siguientes:

  1. Configurar un catálogo de texto en la columna y utilizar la función contains().
  2. Si estaba buscando principalmente con un prefijo (es decir, haciendo coincidir desde el principio del nombre), puede cambiar el predicado a lo siguiente y crear un índice sobre la columna.

    donde fnombre como 'prefijo%'

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

20

FTS puede ayudar en este escenario, la pregunta es si vale la pena o no.

Para empezar, veamos por qué LIKE puede no ser la búsqueda más efectiva. Cuando usa LIKE, especialmente cuando busca con % al comienzo de su comparación, SQL Server necesita realizar un escaneo de tabla de cada fila y un byte por byte de la columna que está revisando.

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

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

Para determinar si FTS va a 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 sobre la búsqueda con LIKE, pero no lo uso en todas las tablas.

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 debe realizar una exploración de índice en lugar de escaneo de tabla.

+1

Para aclarar, FTS no ayudaría sin cambiar la consulta existente. – Brannon

+0

FTS no ayudaría sin cambiar la consulta existente. Pero, si su conjunto de datos es lo suficientemente pequeño, puede usar LIKE sin problemas durante un tiempo. – Josef

6

de acuerdo a mi escenario de prueba:

  • SQL Server 2008
  • 10.000.000 filas cada una con una cadena como "la palabra A. palabra B wordC ..." (varía entre 1 y 30 palabras)
  • seleccionar la cuenta (*) con contiene (columna, "palabra B")
  • tamaño de los resultados de varios cientos de miles
  • tamaño del catálogo de aproximadamente 1,8 GB

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

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

Por lo que recomiendo índice de texto única en los casos en que tiene que hacer una "cadena de búsqueda libre" o utilizar algunas de las características especiales de la misma ...

Cuestiones relacionadas