2009-07-23 13 views
16

qual è esattamente la differenza (e vantaggi/svantaggi) tra un indice di testo completo e un indice normale su una colonna varchar? Quando dovrei usare quale indice?SQL Server: indice normale rispetto all'indice di testo completo

Ho una moltitudine di colonne varchar (indirizzi - nome della città, nome della via, ecc.) Che devo essere ricercabile nel modo più performante e sto cercando di capire quale tipo di indice usare e perché.

Grazie!

risposta

19

Dipende dal tipo di ricerca che si desidera eseguire. Ad esempio, non è possibile utilizzare un indice normale con questa query:

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

Non è sargable. Questo è sargable, ma il selectivity potrebbe non essere molto buona:

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

si utilizza un indice full-text in modo completamente diverso:

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

C'è qualche motivo per non utilizzare un indice di testo completo, quindi? – Alex

+0

Usano molto spazio su disco e sono lenti a ricalcolare. –

+1

La menzione sargable è fantastica - mi sembra che questo non sia insegnato abbastanza. – AndrewPK

8

Di solito, durante la ricerca con un indice normale, puoi solo cercare in un singolo campo, ad es "trova tutte le città che iniziano con A" o qualcosa di simile.

L'indice di testo completo consente di eseguire ricerche su più colonne, ad es. cerca subito in strada, città, provincia, ecc. Questo potrebbe essere un vantaggio se vuoi fare qualcosa come una ricerca in stile Google - basta inserire un termine di ricerca e trovare tutte le righe che hanno quel termine di ricerca ovunque in una qualsiasi delle colonne varchar.

Inoltre, con una ricerca regolare, si è abbastanza limitati in ciò che si può fare: è possibile cercare una corrispondenza esatta o semplicemente LIKE - questo è quanto.

Con l'indice di testo completo, è possibile cercare moduli di parole (eseguiti, eseguiti, ecc.) E anche per parole simili specificando il proprio lessico. Puoi cercare in base a più lingue se questo è un problema. È possibile cercare voci che hanno due o più termini "NEAR" tra loro.

Marc

+1

+1 per aver menzionato i motivi pratici per fare un indice FULLTEXT, piuttosto che commentare la sintassi e le operazioni compatibili. – dayuloli

3

Dal MSDN:

In contrasto con la ricerca full-text, il predicato LIKE Transact-SQL funziona solo sui modelli dei personaggi. Inoltre, non è possibile utilizzare il predicato LIKE per eseguire query di dati binari formattati. Inoltre, una query LIKE su una grande quantità di dati di testo non strutturati è molto più lenta di una query full-text equivalente rispetto agli stessi dati.

Una query LIKE su milioni di righe di dati di testo può richiedere alcuni minuti; mentre una query full-text può richiedere solo secondi o meno rispetto agli stessi dati, a seconda del numero di righe restituite.

Problemi correlati