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]