2009-07-23 20 views
16

¿cuál es la diferencia (y ventajas/desventajas) entre un índice de texto completo y un índice regular en una columna varchar? ¿Cuándo usaría qué índice?SQL Server: índice normal versus índice de texto completo

Tengo una multitud de columnas varchar (direcciones - nombre de la ciudad, nombre de la calle, etc.) que necesito para buscar de la manera más eficiente y estoy tratando de averiguar qué tipo de índice usar y por qué.

¡Gracias!

Respuesta

19

Depende del tipo de búsqueda que desee realizar. Por ejemplo, no se puede utilizar un índice normal con esta consulta:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%' 

No es sargable. Esta es sargable, pero el selectivity podría no ser muy bueno:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%' 

se utiliza un índice de texto de forma completamente diferente:

SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText) 
+0

¿Hay alguna razón para no usar un índice de texto completo? – Alex

+0

Utilizan una gran cantidad de espacio en disco y tardan en calcularse. –

+1

La mención de sargable es impresionante, siento que esto no se enseña lo suficiente. – AndrewPK

8

Por lo general, cuando se busca un índice normal, sólo se puede buscar en un solo campo, por ejemplo "encuentre todas las ciudades que comiencen con A" o algo así.

El índice de texto completo le permite buscar en varias columnas, p. Ej. buscar de una vez en la calle, ciudad, provincia, etc. Eso podría ser una ventaja si quieres hacer algo como una búsqueda al estilo de Google: simplemente abre un término de búsqueda y encuentra todas las filas que tienen ese término de búsqueda en cualquier parte de la columnas varchar.

Además, con una búsqueda regular, está bastante limitado en lo que puede hacer, puede buscar una coincidencia exacta o SIMPLEMENTE, eso es todo.

Con índice de texto completo, puede buscar formularios de palabras (ejecutar, ejecutar, etc.) y también para palabras similares al especificar su propio diccionario de sinónimos. Puede buscar en varios idiomas si eso es un problema. Puede buscar entradas que tienen dos o más términos que son "CERCA" entre sí.

Marc

+1

+1 por mencionar las razones prácticas por las que se debe hacer un índice FULLTEXT, en lugar de solo comentar la sintaxis y las operaciones compatibles. – dayuloli

3

Desde el MSDN:

En contraste con la búsqueda de texto completo, el predicado LIKE de Transact-SQL funciona sólo en patrones de caracteres. Además, no puede usar el predicado LIKE para consultar datos binarios formateados. Además, una consulta LIKE frente a una gran cantidad de datos de texto no estructurados es mucho más lenta que una consulta de texto completo equivalente con los mismos datos.

Una consulta LIKE contra millones de filas de datos de texto puede demorar unos minutos; mientras que una consulta de texto completo puede tomar segundos o menos contra los mismos datos, dependiendo del número de filas que se devuelven.

Cuestiones relacionadas