Un catalogue de texte intégral avec suivi des modifications: AUTO se mettra-il automatiquement à jour si le suivi des modifications pour ce tableau n'est pas activé?

12

J'ai cette table de base de données qui est censée garder l'index de texte intégral à jour. Cependant, je ne le vois pas du tout (aucune erreur dans le journal car le dernier journal que je vois était quand je l'ai déclenché manuellement).

Voici ce que je vois ...

propriétés de catalogue de texte intégral

mais sur la table elle-même ...

entrez la description de l'image ici

Serait-ce la raison pour laquelle cela ne se produit pas automatiquement?

MetaGuru
la source
Pour plus de clarté, à quel journal faites-vous référence?
Mike Zalansky
@mikezalansky c'est le journal de texte complet qui peut être trouvé à(..\MSSQL\Log\SQLFT*)
Kin Shah

Réponses:

14

Vous regardez au mauvais endroit.

Vous devez vérifier comme ci-dessous:

entrez la description de l'image ici

entrez la description de l'image ici

Utilisation de T-SQL ..

Use database_name
go
ALTER FULLTEXT INDEX ON schema.table_name SET CHANGE_TRACKING AUTO;

Une fois terminé, vous pouvez vérifier l'état de la dernière date / heure remplie

-- script source : http://stackoverflow.com/a/10505496/1387418
-- Modified by Kin on Dec 14' 2015 to reflect the FTCatalogName
DECLARE @CatalogName VARCHAR(MAX)
SET     @CatalogName = 'AW2008FullTextCatalog' -- change here !

SELECT name as FTCatalogName, 
    DATEADD(ss, FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateCompletionAge'), '1/1/1990') AS LastPopulated
    ,(SELECT CASE FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateStatus')
        WHEN 0 THEN 'Idle'
        WHEN 1 THEN 'Full Population In Progress'
        WHEN 2 THEN 'Paused'
        WHEN 3 THEN 'Throttled'
        WHEN 4 THEN 'Recovering'
        WHEN 5 THEN 'Shutdown'
        WHEN 6 THEN 'Incremental Population In Progress'
        WHEN 7 THEN 'Building Index'
        WHEN 8 THEN 'Disk Full.  Paused'
        WHEN 9 THEN 'Change Tracking' END) AS PopulateStatus
FROM sys.fulltext_catalogs

entrez la description de l'image ici

Insérez des données ..

insert into HumanResources.JobCandidate
(BusinessEntityID, Resume, ModifiedDate)
values 
    (4, NULL, DEFAULT)

Vous verrez maintenant que le catalogue FT est mis à jour.

entrez la description de l'image ici

Dans les journaux ( ..\MSSQL\Log\SQLFT*) également, se trouve ci-dessous le message ...

2015-12-14 12: 36: 51.29 spid50s Information: remplissage automatique en texte intégral pour la table ou la vue indexée '[AdventureWorks2012]. [HumanResources]. [JobCandidate]' (ID de table ou de vue indexée '1589580701', ID de base de données ' 5 '). Nombre de documents traités: 1. Nombre de documents ayant échoué: 0. Nombre de documents qui seront retentés: 0.

De BOL :

Par défaut, ou si vous spécifiez CHANGE_TRACKING AUTO, le moteur de texte intégral utilise le remplissage automatique sur l'index de texte intégral. Une fois la population complète initiale terminée, les modifications sont suivies lorsque les données sont modifiées dans la table de base et les modifications suivies sont propagées automatiquement. Toutefois, l'index de texte intégral est mis à jour en arrière-plan, de sorte que les modifications propagées peuvent ne pas être immédiatement reflétées dans l'index .

Par défaut, SQL Server remplit entièrement un nouvel index de texte intégral dès sa création. Cependant, une population entière peut consommer une quantité importante de ressources. Par conséquent, lors de la création d'un index de texte intégral pendant les périodes de pointe, il est souvent recommandé de retarder la population complète jusqu'à une heure creuse, en particulier si la table de base d'un index de texte intégral est grande. Toutefois, le catalogue de texte intégral auquel appartient l'index n'est pas utilisable tant que tous ses index de texte intégral ne sont pas remplis.

Reportez-vous également à Améliorer les performances des index de texte intégral

Kin Shah
la source
Merci! Le problème que je regarde est pourquoi il ne semble pas du tout mettre à jour tant que je ne reconstruis pas manuellement l'index. Je ne sais pas si c'est lié, mais la base de données qui semble avoir le plus ce problème est celle qui est également en miroir.
MetaGuru
Issue I am looking at is why it doesn't seem to update at all until I manually rebuild the index.l'avez-vous réglé selon ce que j'ai montré. S'il y a beaucoup de changements, alors ça va prendre du temps, puisqueThe full-text index is updated in the background, however, so propagated changes might not be reflected immediately in the index.
Kin Shah
ouais j'ai vérifié les endroits que vous avez montrés et il a été correctement configuré comme dans vos exemples ... étrangement bien que la dernière fois que les journaux indiquent que cet index a été mis à jour il y a un certain temps, des semaines même, comparé à la dernière fois que de nouvelles lignes ont été ajoutées .. . il fonctionnerait lorsque de nouvelles lignes sont ajoutées selon ce droit?
MetaGuru
1
Oui .. J'ai testé puis posté comme réponse.
Kin Shah
1

Pour une raison quelconque, l'indexeur de texte intégral a arrêté le remplissage automatique pour l'une de mes bases de données SQL 2012 après que mon réplica de base de données de groupe de disponibilité secondaire a pris le relais et est devenu le réplica principal.

Après avoir supprimé l'index de texte intégral et l'avoir recréé sur la table avec le remplissage automatique activé, il a recommencé à s'autopopuler. J'ai utilisé SQL Management Studio et l'assistant de création d'index de texte intégral pour recréer l'index.

J'étais inquiet du temps qu'il faudrait pour exécuter une indexation complète des données. J'ai été agréablement surpris de constater qu'il n'a fallu que 5 minutes environ pour réindexer 3 colonnes de texte d'une table contenant 547619 enregistrements.

Les paramètres de suivi des modifications au niveau du tableau mentionnés dans la question sont restés désactivés. Ainsi, le suivi des modifications de l'index de texte intégral est définitivement différent du paramètre de suivi des modifications de table. Vous n'avez PAS besoin d'activer le suivi des modifications de table pour que le suivi des modifications d'indexation de texte intégral et l'indexation de texte intégral fonctionnent correctement.

L'exécution de la requête suivante à partir de la base de données révélera la dernière fois que votre indexeur de texte intégral a exécuté une analyse.

  SELECT  * FROM sys.fulltext_indexes

Lorsque le remplissage automatique est activé, le crawl_end_date doit changer après avoir inséré des données dans la table.

En outre, vous remarquerez que lorsque vous exécutez une requête qui utilise l'index de texte intégral, elle affiche les dernières données:

  select TOP 10 * from YOURDATATABLE where contains((YOUR_indexed_column),'YOURSEARCHTERM') order by YOURPRIMARYKEYCOLUMN desc

Références supplémentaires:

Article décrivant différentes méthodes de recherche de texte intégral: https://msdn.microsoft.com/en-us/library/ms142575%28v=sql.100%29.aspx

Informations sur l'interrogation d'une table indexée en texte intégral: https://technet.microsoft.com/en-us/library/ms142571(v=sql.110).aspx#queries

Article sur l'architecture de recherche de texte intégral: https://technet.microsoft.com/en-us/library/ms142571(v=sql.110).aspx#architecture

WWC
la source