Alimentation d'un index de recherche en texte intégral

La création et la gestion d'un index de recherche en texte intégral implique d'alimenter l'index en utilisant un processus appelé alimentation (également appelé analyse). SQL Server prend en charge les types d'alimentation suivants : alimentation complète, alimentation manuelle ou automatique basée sur le suivi des modifications et alimentation incrémentielle basée sur l'horodateur.

Alimentation complète

Au cours d'une alimentation complète, les entrées d'index sont créées pour toutes les lignes d'une table ou d'une vue indexée. Une alimentation complète d'un index de recherche en texte intégral crée des entrées d'index pour toutes les lignes de la table de base ou de la vue indexée.

Par défaut, SQL Server alimente complètement un nouvel index de recherche en texte intégral dès que celui-ci est créé. Cependant, une alimentation complète peut consommer beaucoup de ressources. Par conséquent, si vous créez un index de recherche en texte intégral pendant une période de pointe, il est recommandé de reporter l'alimentation complète à une période creuse, en particulier si la table de base d'un index de recherche en texte intégral est volumineuse. Toutefois, le catalogue de texte intégral auquel l'index appartient n'est pas utilisable tant que tous ses index de recherche en texte intégral ne sont pas alimentés. Pour créer un index de recherche en texte intégral sans l'alimenter immédiatement, spécifiez la clause CHANGE_TRACKING OFF, NO POPULATION dans votre instruction Transact-SQL CREATE FULLTEXT INDEX. SQL Server n'alimente pas le nouvel index de recherche en texte intégral tant que vous n'exécutez pas une instruction Transact-SQL ALTER FULLTEXT INDEX avec la clause START FULL POPULATION ou START INCREMENTAL POPULATION. Pour plus d'informations, consultez l'exemple « A. Création d'un index de recherche en texte intégral sans exécuter une alimentation complète » et l'exemple « B. Exécution d'une alimentation complète sur une table », présentés ultérieurement dans cette rubrique.

Alimentation basée sur le suivi des modifications

Vous pouvez éventuellement utiliser le suivi des modifications pour procéder à la gestion d'un index de recherche en texte intégral après son alimentation complète initiale. La surcharge associée au suivi des modifications est réduite, car SQL Server gère une table dans laquelle il suit les modifications apportées à la table de base depuis la dernière alimentation. Lorsque le suivi des modifications est utilisé, SQL Server gère un enregistrement des lignes de la table de base ou de la vue indexée ayant été modifiées par des opérations de mise à jour, de suppression ou d'insertion. Les modifications apportées aux données via WRITETEXT et UPDATETEXT ne sont pas répercutées dans l'index de recherche en texte intégral et ne sont pas prises en compte par le suivi des modifications.

Notes

Pour les tables qui contiennent une colonne timestamp, vous pouvez utiliser des alimentations incrémentielles.

Lorsque le suivi des modifications est activé pendant la création d'index, SQL Server alimente complètement le nouvel index de recherche en texte intégral juste après sa création. Ensuite, les modifications font l'objet d'un suivi et propagées à l'index de recherche en texte intégral. Il existe deux types de suivi des modifications : automatique (option CHANGE_TRACKING AUTO) et manuel (option CHANGE_TRACKING MANUAL). Le suivi des modifications automatique est le comportement par défaut.

Le type de suivi des modifications détermine la façon dont l'index de recherche en texte intégral est alimenté, comme expliqué ci-après.

  • Alimentation automatique

    Par défaut, ou si vous spécifiez CHANGE_TRACKING AUTO, le Moteur d'indexation et de recherche en texte intégral utilise l'alimentation automatique sur l'index de recherche en texte intégral. Une fois l'alimentation complète initiale terminée, les données modifiées dans la table de base font l'objet d'un suivi, et ces modifications sont propagées automatiquement. L'index de recherche en texte intégral étant toutefois mis à jour en arrière-plan, il se peut que les modifications propagées ne soient pas répercutées immédiatement dans l'index.

    Pour configurer le suivi des modifications avec alimentation automatique

    Pour plus d'informations, consultez l'exemple « E. Modification d'un index de recherche en texte intégral pour qu'il utilise le suivi des modifications automatique », présenté ultérieurement dans cette rubrique.

  • Alimentation manuelle

    Si vous spécifiez CHANGE_TRACKING MANUAL, le Moteur d'indexation et de recherche en texte intégral utilise l'alimentation manuelle sur l'index de recherche en texte intégral. Une fois l'alimentation complète initiale terminée, les données modifiées dans la table de base font l'objet d'un suivi. Toutefois, elles ne sont pas propagées à l'index de recherche en texte intégral tant que vous n'exécutez pas une instruction ALTER FULLTEXT INDEX … START UPDATE POPULATION. Vous pouvez utiliser l'Agent SQL Server pour appeler régulièrement cette instruction Transact-SQL.

    Pour commencer le suivi des modifications avec alimentation manuelle

    Pour plus d'informations, consultez l'exemple « C. Création d'un index de recherche en texte intégral avec le suivi des modifications manuel » et l'exemple « D. Exécution d'une alimentation manuelle », présentés ultérieurement dans cette rubrique.

Pour désactiver le suivi des modifications

Alimentation incrémentielle basée sur l'horodateur

L'alimentation incrémentielle est un autre mécanisme permettant d'alimenter manuellement un index de recherche en texte intégral. Vous pouvez exécuter une alimentation incrémentielle pour un index de recherche en texte intégral pour lequel CHANGE_TRACKING a la valeur MANUAL ou OFF. Si la première alimentation d'un index de recherche en texte intégral est une alimentation incrémentielle, elle indexe toutes les lignes, ce qui équivaut à une alimentation complète.

Pour permettre une alimentation incrémentielle, la table indexée doit disposer d'une colonne dont le type de données est timestamp. S'il n'existe pas de colonne de type timestamp, l'alimentation incrémentielle ne peut s'effectuer. Une demande d'alimentation incrémentielle dans une table sans colonne de type timestamp entraîne une alimentation complète. En outre, si des métadonnées concernant l'index de recherche en texte intégral de la table ont été modifiées depuis la dernière alimentation, les demandes d'alimentation incrémentielle sont implémentées comme des alimentations complètes. Cela concerne les modifications de métadonnées provoquées par des modifications de définitions de colonne, d'index ou d'index de recherche en texte intégral.

SQL Server utilise la colonne timestamp pour identifier des lignes qui ont été modifiées depuis la dernière alimentation. L'alimentation incrémentielle met alors à jour l'index de recherche en texte intégral avec les lignes ajoutées, supprimées ou modifiées après la dernière alimentation ou pendant l'exécution de cette dernière. Si une table fait l'objet d'un nombre important d'insertions, l'alimentation incrémentielle peut s'avérer plus efficace que l'alimentation manuelle.

À la fin d'une alimentation, le Moteur d'indexation et de recherche en texte intégral enregistre une nouvelle valeur timestamp. Il s'agit de la plus grande valeur timestamp rencontrée par l'utilitaire de rassemblement SQL. Cette valeur sera utilisée au démarrage de la prochaine alimentation incrémentielle.

Pour exécuter une alimentation incrémentielle, exécutez une instruction ALTER FULLTEXT INDEX avec la clause START INCREMENTAL POPULATION.

Pour planifier un travail d'alimentation incrémentielle

Exemples

Notes

Les exemples de cette section utilisent la table Production.Document ou HumanResources.JobCandidate de l'exemple de base de données AdventureWorks2008R2.

A. Création d'un index de recherche en texte intégral sans exécuter une alimentation complète

L'exemple ci-après crée un index de recherche en texte intégral sur la table Production.Document de l'exemple de base de données AdventureWorks2008R2. Cet exemple utilise WITH CHANGE_TRACKING OFF, NO POPULATION pour différer l'alimentation complète initiale.

CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
CREATE FULLTEXT CATALOG AW_Production_FTCat;
CREATE FULLTEXT INDEX ON Production.Document
(
    Document                         --Full-text index column name 
        TYPE COLUMN FileExtension    --Name of column that contains file type information
        Language 1033                 --1033 is LCID for the English language
)
    KEY INDEX ui_ukDoc
    ON AW_Production_FTCat
    WITH CHANGE_TRACKING OFF, NO POPULATION;
GO

B. Exécution d'une alimentation complète sur une table

L'exemple ci-après exécute une alimentation complète sur la table Production.Document de l'exemple de base de données AdventureWorks2008R2.

ALTER FULLTEXT INDEX ON Production.Document
   START FULL POPULATION;

C. Création d'un index de recherche en texte intégral avec le suivi des modifications manuel

L'exemple ci-après crée un index de recherche en texte intégral qui utilisera le suivi des modifications avec alimentation manuelle sur la table HumanResources.JobCandidate de l'exemple de base de données AdventureWorks2008R2.

USE AdventureWorks2008R2;
GO
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) 
   KEY INDEX ui_ukJobCand 
   WITH CHANGE_TRACKING=MANUAL;
GO

D. Exécution d'une alimentation manuelle

L'exemple ci-après exécute une alimentation manuelle sur l'index de recherche en texte intégral faisant l'objet d'un suivi des modifications, sur la table HumanResources.JobCandidate de l'exemple de base de données AdventureWorks2008R2.

USE AdventureWorks2008R2;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;
GO

E. Modification d'un index de recherche en texte intégral pour qu'il utilise le suivi des modifications automatique

L'exemple ci-après modifie l'index de recherche en texte intégral de la table HumanResources.JobCandidate de l'exemple de base de données AdventureWorks2008R2 pour qu'il utilise le suivi des modifications avec alimentation automatique.

USE AdventureWorks2008R2;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;
GO