Cet article concerne un problème rencontré chez l’un de nos clients sur la mise à jour d’un index fulltext :
Voici la question du client (les informations confidentielles sont masquées):
 Suite à une plainte d’un client, nous avons découvert que la table TB_appel a un défaut d’indexation FT.
select DISPLAY_TERM
 from sys.dm_fts_index_keywords_By_Document (db_id(‘db1’),object_id(‘ TB_appel’))
 WHERE document_id = 549118
retourne aucun contenu.
Apparement, depuis le ../..2012, aucune annonce n’a été indéxée en FT.
Pouvez voir ce qui ce passe ?
Voici la méthode de résolution utilisée :
1- je vérifie la requête, effectivement aucune ligne retournée …
2-vérification du type de mise à jour sur l’index :
select * from sys.fulltext_indexes where object_id= object_id('dbo.TB_appel')
object_id   unique_index_id fulltext_catalog_id is_enabled change_tracking_state change_tracking_state_desc     ...
----------- --------------- ------------------- ---------- --------------------- ------------------------------ ...
1694733190  1               13                  1          A                     AUTO                           ...La propriété change_tracking est bien positionnée à AUTO,
 l’index devrait être mis à jour par le moteur en fonction des mises à jour sur la table.
3 – je vérifie l’état des populations (mise à jour) d’indexes en cours
  -- populations en cours
   select database_id, catalog_id , table_id, population_type_description , status, status_description	
   from sys.dm_fts_index_population where table_id=object_id('TB_appel') and database_id=6
   database_id	catalog_id	table_id	population_type_description	status status_description
   ----------- ----------- ----------- ------------------------------ ------------------ --------
   6	               13	     1694733190	AUTO	                                11	AbortedLa colonne status_description contient la valeur Aborted
4- J’annule la reconstruction sur l’index
-- stop la population ALTER FULLTEXT INDEX ON dbo.TB_appel SET CHANGE_TRACKING MANUAL; Command(s) completed successfully.
5- Je lance une population manuelle de l’index
-- mise à jour de l'index
   set  statistics time on
   ALTER FULLTEXT INDEX ON dbo.TB_appel START UPDATE POPULATION;
   * info - UPDATE : Spécifie le traitement de toutes les insertions, mises à jour ou suppressions depuis la dernière mise à jour de
    l'index de suivi des modifications. Le remplissage du suivi des modifications doit être activé sur une table,
    mais l'index de mise à jour en arrière-plan ou le suivi automatique des modifications doivent être désactivés.6- Je suis l’avancement de la population de l’index
  
select * from sys.dm_fts_index_population where table_id=object_id('TB_appel')  and database_id=6
  select database_id, catalog_id , table_id, population_type_description , status_description	
  from sys.dm_fts_index_population where table_id=object_id('TB_appel') and database_id=6
  database_id	catalog_id	table_id	population_type_description	status status_description 
database_id      catalog_id           table_id     population_type_description   status_description 
   ----------- -----------       -----------     ---------------------------  ------------------ 
   6                        13           1694733190       MANUAL                          Processing normally ...      
 -- Suivi des ranges de valeurs à mettre à jour
  SELECT ranges.*, ranges.*, OBJECT_NAME (table_id)
   FROM sys.dm_fts_index_population population
   JOIN sys.dm_fts_population_ranges ranges
   ON (population.memory_address = ranges.parent_memory_address)
   WHERE ranges.session_id <> 0
  memory_address     parent_memory_address is_retry session_id processed_row_count error_count
   ------------------ --------------------- -------- ---------- ------------------- ----------- ------------------------------
   0x078B2040         0x055226A8            0        29         6000                0			TB_appel
   0x078B3048         0x055226A8            0        30         6000                0			TB_appel
   => on voit le nombre de lignes traitées7- Une fois la repopulation de l’indes terminée, je remets l’index en mode CHANGE_TRACKING AUTO
ALTER FULLTEXT INDEX ON dbo.TB_appel SET CHANGE_TRACKING AUTO;
Continuez votre lecture sur le blog :
- Regénérer le DDL des indexes FULL TEXT (David Baffaleuf) [SQL Server]
 - Retrouver les tables dont les stats ne sont plus compilées en automatique (David Baffaleuf) [SQL Server]
 - Alter table rebuild (Benjamin VESAN) [SQL Server]
 - Nouveautés MySQL 8.0 : Les Histogrammes (Capdata team) [MySQL]
 - Déterminer la fréquence horaire d’exécution d’une procédure stockée sous SQL Server (Capdata team) [SQL Server]