Mettre à jour les requêtes plus lentement après avoir activé l'index de texte intégral SQL Server

10

J'ai un site Web asp.net avec de nombreuses requêtes d'insertion, de mise à jour et de suppression exécutées sur ma base de données.

Il y a quelques jours, je crée un index de texte intégral sur deux colonnes d'un des tableaux. Après cela, j'ai réalisé que lorsque le site Web exécute des requêtes de mise à jour sur cette table, l'utilisation de la mémoire et du disque du processus SQL Server saute et les mises à jour sont plus lentes. Les requêtes ont été exécutées sans aucun problème de performances avant de créer l'index de texte intégral.

J'ai également réalisé que les requêtes de mise à jour qui étaient très simples auparavant, sont maintenant compliquées, car le plan d'exécution comporte désormais des éléments tels que la mise à jour de l'index de texte intégral. Cela fait partie d'un nouveau plan d'exécution qui est devenu compliqué après l'activation du texte intégral:

entrez la description de l'image ici

Dans certaines heures, lorsque je mets à jour le contenu du site, j'ai exécuté 5000 requêtes de mise à jour et je pense que le processus d'indexation de texte intégral est effectué à chaque fois pour chaque ligne.

Dois-je désactiver l'analyse de texte intégral au début de la mise à jour des lignes, puis la réactiver (comme dans cette question connexe )?

Puis-je dire à SQL Server d'arrêter l'indexation de texte intégral pendant 5 minutes, puis de commencer l'indexation de nouvelles données?

Y a-t-il une meilleure alternative? J'utilise SQL Server 2012.

Mohammad Ha
la source

Réponses:

2

Dans mon cas, j'ai dû modifier une instruction UPDATE inefficace:

Avant:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

Après:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

Cela a amélioré les performances de 4 minutes à 5 secondes. Le problème était que j'avais l'habitude de mettre à jour toutes les lignes, même si elles avaient déjà la valeur que je voulais assigner.

Fabien
la source
1

Si vous l'arrêtez (désactivez-le), l'index ne sera pas disponible pour les requêtes l'utilisant.

Cependant, vous pouvez définir le suivi des modifications sur manuel:

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO

Vous pouvez vérifier la valeur actuelle avec cette requête:

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

Les options valides sont: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Spécifie si les modifications (mises à jour, suppressions ou insertions) apportées aux colonnes de table couvertes par l'index de texte intégral seront propagées par SQL Server vers l'index de texte intégral. Les données changent WRITETEXTet UPDATETEXTne sont pas reflétées dans l'index de texte intégral et ne sont pas récupérées avec le suivi des modifications.

Consultez la documentation Microsoft pour ALTER FULLTEXT INDEX (Transact-SQL) .

Julien Vavasseur
la source