2009-07-23 6 views
16

Quelle est exactement la différence (et les avantages/désavantages) entre un index fulltext et un index normal sur une colonne varchar? Quand devrais-je utiliser quel index? J'ai une multitude de colonnes varchar (adresses - nom de la ville, nom de la rue, etc.) dont j'ai besoin d'être consultable de la manière la plus performante et j'essaie de comprendre quel type d'index utiliser et pourquoi.SQL Server: Index normal par rapport à l'index Fulltext

Merci!

Répondre

19

Cela dépend du type de recherche que vous voulez effectuer. Par exemple, vous ne pouvez pas utiliser un index normal avec cette requête:

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

Ce n'est pas sargable. Ceci est sargable, mais le selectivity peut-être pas très bon:

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

Vous utilisez un index de texte intégral complètement différent:

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

Existe-t-il une raison pour ne pas utiliser un index de texte intégral? – Alex

+0

Ils utilisent beaucoup d'espace disque et sont lents à recalculer. –

+1

La mention sargable est géniale - j'ai l'impression que ce n'est pas assez enseigné. – AndrewPK

8

Habituellement, lors de la recherche d'un index normal, vous pouvez rechercher uniquement dans un seul champ, p.ex. "Trouver toutes les villes qui commencent par A" ou quelque chose comme ça.

L'index de texte intégral vous permet de rechercher sur plusieurs colonnes, par ex. Cette recherche peut être utile si vous voulez faire quelque chose comme une recherche de style Google - il vous suffit de saisir un terme de recherche et de trouver toutes les lignes qui ont ce terme de recherche n'importe où dans l'une des zones de recherche. colonnes varchar. En outre, avec une recherche régulière, vous êtes assez limité dans ce que vous pouvez faire - vous pouvez rechercher une correspondance exacte ou juste comme - c'est à peu près tout. Avec l'index du texte intégral, vous pouvez rechercher des formes de mot (couru, courir, etc.) et également des mots semblables en spécifiant votre propre thésaurus. Vous pouvez effectuer une recherche en fonction de plusieurs langues si c'est un problème. Vous pouvez rechercher des entrées qui ont deux termes ou plus qui sont «près» les uns des autres.

Marc

+1

+1 pour avoir mentionné les raisons pratiques de faire un index FULLTEXT, plutôt que de commenter la syntaxe et les opérations compatibles. – dayuloli

3

De l'MSDN:

Contrairement à la recherche en texte intégral, le prédicat LIKE Transact-SQL fonctionne sur les modèles de caractères seulement. En outre, vous ne pouvez pas utiliser le prédicat LIKE pour interroger des données binaires formatées. En outre, une requête LIKE contre une grande quantité de données de texte non structurées est beaucoup plus lente qu'une requête de texte intégral équivalente contre les mêmes données.

Une requête LIKE contre des millions de lignes de données de texte peut prendre plusieurs minutes à renvoyer; tandis qu'une requête de texte intégral peut prendre seulement secondes ou moins par rapport aux mêmes données, en fonction du nombre de lignes qui sont renvoyées.