DetailPage-MSS-KB

Base de connaissances

Numéro d'article: 2549443 - Dernière mise à jour: vendredi 22 mars 2013 - Version: 2.0

 

Résumé

Cet article décrit une méthode pour améliorer les performances des requêtes Microsoft SQL Server qui utilisent des prédicats de recherche de texte intégral (par exemple, CONTAINS et CONTAINSTABLE) et qui également filtrer les données. Par exemple, cette méthode améliore les performances de la requête suivante :
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Cette méthode vous permet de concevoir la requête, un schéma de table et index de texte intégral de manière à ce que le moteur de recherche de texte intégral filtre les résultats avant de les envoyer au moteur relationnel. Par conséquent, le moteur relationnel n'a pas filtrer un ensemble de données volumineux.

Plus d'informations

Lorsque vous créez une requête de recherche de texte intégral, le facteur du principe qu'affecte les performances de la requête sont la quantité de données que le moteur de recherche de texte intégral doit traiter avant les autres données sont envoyées au moteur relationnel. Dans SQL Server, vous pouvez améliorer les performances de la requête en filtrant les lignes plus tôt que prévu pour réduire le nombre de lignes qui doivent être traitées ultérieurement.

Dans les versions de SQL Server qui ont été publiées avant SQL Server 2008, le moteur de recherche de texte intégral renvoie toutes les lignes qui correspondent à un terme de recherche, et ensuite le moteur relationnel s'applique à tous les filtres. Améliorations apportées à ce problème ont été apportées dans SQL Server 2008, SQL Server 2008 R2 et SQL Server 2012. Toutefois, il est difficile d'utiliser ces améliorations, car l'index de recherche de texte intégral sont organisés très différemment à partir de l'index de base de données. En outre, le moteur de recherche de texte intégral et le moteur relationnel fonctionnent très différemment. Par conséquent, la méthode décrite dans cet article utilise la fonction de table (TVF) pour filtrer les lignes au début et de réduire le nombre de lignes qui doivent être traitées ultérieurement.

Par exemple, le plan de requête suivante renvoie les 131051 lignes qui correspondent à une chaîne de recherche CONTAINS. En outre, un opérateur de jointure dans le plan effectue un filtrage supplémentaire à l'aide d'une recherche d'index.
Rows StmtText 
-------------------- -----------------------------------------------------------------------------------------------------------
1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 

1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA
5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 
5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[
131051 |--Table-valued function 
Toutefois, si la requête inclut la colonne de clé d'index de texte intégral unique sous forme de prédicat, le moteur de recherche de texte intégral pouvez utiliser le prédicat pour filtrer les résultats au niveau de texte intégral. Dans ce cas, la TVF renvoie une plus petite quantité de données avant de filtrage supplémentaire doit être appliqué. Par exemple, la requête suivante spécifie cinq valeurs qui doivent correspondre à la condition de c2, et la TVF renvoie uniquement les résultats qui correspondent aux cinq valeurs :
Rows StmtText 

-------- ---------------------------------------------------------------------------------------------------------------------------------
5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)

5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 
5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...
5 |--Table-valued function
Capacité du moteur de recherche de texte intégral pour pousser les valeurs qui sont utilisées par la clé d'index unique est la base de la méthode suivante.

Si un prédicat contient une colonne de type de données DateTime, vous pouvez inclure des informations de date dans la colonne de clé d'index unique afin que seules les lignes qui correspondent à ce prédicat sont émis. Pour ce faire, vous devez logiquement incorporer les informations de date dans la colonne de clé. Toutefois, vous devrez également modifier le type de données de colonne de clé et les applications qui utilisent la requête.

Pour implémenter la méthode, modifiez le type de données de l'unique de texte intégral ID en BIGINT de clé. Les 4 premiers octets de la clé capture ID l'année, mois et les valeurs de date à partir de la colonne de date et les 4 derniers octets restent les mêmes. Par exemple, le premier octet de la clé QU'ID pourrait faire référence à l'année, l'octet suivant pourrait faire référence au mois et les deux derniers octets pourrait faire référence à la date. L'application doit prendre en compte ce changement de type de données.

Ensuite, traduire un prédicat de la plage à un prédicat sur la clé de code. Par exemple, le "x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
  • Microsoft SQL Server 2012 Enterprise
Mots-clés : 
kbmt KB2549443 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 2549443  (http://support.microsoft.com/kb/2549443/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Partager
Options de support supplémentaire
Forums du support Microsoft Community
Nous contacter directement
Trouver un partenaire Microsoft Certified Partner
Microsoft Store