Améliorer les performances des requêtes de texte intégral

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

La liste suivante de recommandations permet d’améliorer les performances des requêtes en texte intégral.

Les performances des requêtes de texte intégral sont également influencées par les ressources matérielles telles que la mémoire, la vitesse du disque et du processeur, ainsi que par l'architecture de l'ordinateur.

  • Défragmentez l’index de la table de base à l’aide de ALTER INDEX REORGANIZE.

  • Réorganisez le catalogue de texte intégral à l’aide de ALTER FULLTEXT CATALOG REORGANIZE. Assurez-vous d'effectuer ces opérations avant de tester les performances car l'exécution de cette instruction entraîne une fusion principale des index de texte intégral dans ce catalogue.

  • Limitez le choix de vos colonnes clés de texte intégral à une petite colonne. Même si une colonne de 900 octets est prise en charge, il est recommandé d'utiliser une colonne clé inférieure à cette taille dans un index de recherche en texte intégral. int et bigint offrent les meilleures performances.

  • L’utilisation d’une clé de texte intégral de type entier évite une jointure avec la table de mappage docid . Par conséquent, une clé de texte intégral de type entier améliore considérablement les performances des requêtes et renforce les performances d'analyse. D’autres avantages en matière de performances peuvent se produire si la clé de recherche en texte intégral est également la clé d’index cluster.

  • Regroupez plusieurs prédicats CONTAINS dans un seul prédicat CONTAINS. Dans SQL Server, vous pouvez spécifier une liste de colonnes dans la requête CONTAINS.

  • Utilisez CONTAINSTABLE ou FREETEXTTABLE au lieu de CONTAINS ou FREETEXT respectivement, si vous n’avez besoin que d’informations sur la clé de texte intégral ou le rang.

  • Pour limiter les résultats et augmenter les performances, utilisez le paramètre top_n_by_rank des fonctions FREETEXTTABLE et CONTAINSTABLE. top_n_by_rank vous permet de rappeler uniquement les accès les plus pertinents. Utilisez ce paramètre uniquement si votre scénario métier ne nécessite pas de rappel de tous les accès possibles (autrement dit, il ne nécessite pas le rappel total).

    Note

    Le rappel total est généralement requis pour les scénarios juridiques, mais il peut être moins important que les performances pour les scénarios d'entreprise tels qu'un e-business.

  • Vérifiez le plan de requête de texte intégral pour vous assurer que le plan de jointure adéquat a été sélectionné. Utilisez un indicateur de jointure ou un indicateur de requête si nécessaire. Si un paramètre est utilisé dans la requête de texte intégral, la valeur initiale du paramètre détermine le plan de requête. Vous pouvez utiliser l’ indicateur de requête OPTIMIZE FOR pour forcer la requête à une compilation avec la valeur souhaitée. Il est ainsi possible d'obtenir un plan de requête déterministe et de meilleures performances.

  • Trop de fragments d'index de recherche en texte intégral dans l'index de texte intégral peut conduire à une dégradation substantielle dans les performances des requêtes. Pour réduire le nombre de fragments, réorganisez le catalogue de texte intégral à l’aide de l’option REORGANIZE de l’instruction TRANSACT-SQL ALTER FULLTEXT CATALOG. Cette instruction fusionne essentiellement tous les fragments en un plus grand fragment unique et supprime toutes les entrées obsolètes de l'index de recherche en texte intégral.

  • Dans la recherche en texte intégral , les opérateurs logiques spécifiés dans CONTAINSTABLE (AND, OR) peuvent être implémentés en tant que jointures SQL ou bien dans des fonctions table de diffusion d'exécution de texte intégral (STVF). En général, les requêtes avec un seul type d'opérateur logique sont implémentées exclusivement par l'exécution de texte intégral, alors que les requêtes qui combinent des opérateurs logiques possèdent également des jointures SQL. L'implémentation d'un opérateur logique dans la fonction table multi-diffusion d'exécution de texte intégral utilise quelques propriétés d'index spéciales qui la rendent beaucoup plus rapide que les jointures SQL. Pour cette raison, nous vous recommandons de cadrer vos requêtes à l’aide d’un seul type d’opérateur logique.

  • Pour les applications qui contiennent des prédications de relation sélective, les requêtes qui utilisent des prédicats relationnels sélectifs et des prédicats de texte intégral désélectionnels peuvent s’avérer optimales lorsqu’ils sont écrits pour utiliser l’optimiseur de requête. Cela permet à l'optimiseur de requête de déterminer s'il peut exploiter le prédicat ou le menu déroulant de plage pour produire un plan de requête effectif. Cette approche est plus simple et souvent plus efficace que l'indexation des données relationnelles comme données de texte intégral.

SQL Server 2008 Full-Text Search: Internals and Enhancements (en anglais)

Voir aussi

sys.dm_fts_memory_buffers (Transact-SQL)
sys.dm_fts_memory_pools (Transact-SQL)