Améliorer les performances des index de recherche en texte intégralImprove the Performance of Full-Text Indexes

Cette rubrique décrit certaines causes courantes à l’origine de performances médiocres des requêtes et des index de recherche en texte intégral.This topic describes some of the common causes of poor performance for full-text indexes and queries. Elle fournit également quelques suggestions pour éviter ces problèmes et améliorer les performances.It also provides a few suggestions to mitigate these issues and improve performance.

Causes courantes des problèmes de performances Common causes of performance issues

Problèmes liés aux ressources matériellesHardware resource issues

Les performances de l’indexation de texte intégral et des requêtes de texte intégral sont influencées par les ressources matérielles, telles que la mémoire, la vitesse du disque et de l’UC, ainsi que l’architecture de la machine.The performance of full-text indexing and full-text queries is influenced by hardware resources, such as memory, disk speed, CPU speed, and machine architecture.

La cause principale d’une baisse des performances de l’indexation de texte intégral se rapporte aux limites des ressources matérielles.The main cause for reduced full-text indexing performance is hardware-resource limits.

  • UC.CPU. Si l’utilisation de l’UC par le processus hôte de démon de filtre (fdhost.exe) ou le processus (sqlservr.exe) SQL ServerSQL Server approche des 100 pour cent, le processeur est le goulet d’étranglement.If CPU usage by the filter daemon host process (fdhost.exe) or the SQL ServerSQL Server process (sqlservr.exe) is close to 100 percent, the CPU is the bottleneck.

  • Mémoire.Memory. Une insuffisance de mémoire physique peut signaler l’existence d’un goulot d’étranglement au niveau de la mémoire.If there is a shortage of physical memory, memory might be the bottleneck.

  • Disque.Disk. Si la longueur moyenne de la file d'attente du disque est plus de deux fois supérieure au nombre de têtes de disque, le disque est engorgé.If the average disk-waiting queue length is more than two times the number of disk heads, there is a bottleneck on the disk. La première solution consiste à créer des catalogues de texte intégral distincts des fichiers et des journaux de la base de données SQL ServerSQL Server .The primary workaround is to create full-text catalogs that are separate from the SQL ServerSQL Server database files and logs. Placez les journaux, les fichiers de base de données et les catalogues de texte intégral sur des disques distincts.Put the logs, database files, and full-text catalogs on separate disks. L’installation de disques plus rapides et l’utilisation de RAID peuvent également contribuer à améliorer les performances d’indexation.Installing faster disks and using RAID can also help improve indexing performance.

    Note

    À partir de SQL Server 2008SQL Server 2008, le moteur d’indexation et de recherche en texte intégral peut utiliser la mémoire AWE parce qu’il fait partie du processus sqlservr.exe.Beginning in SQL Server 2008SQL Server 2008, the Full-Text Engine can use AWE memory because the Full-Text Engine is part of the sqlservr.exe process.

Problèmes liés au traitement par lot de recherche en texte intégralFull-text batching issues

Si le système ne rencontre aucun goulet d'étranglement matériel, les performances d'indexation de la recherche en texte intégral dépendent essentiellement des éléments suivants :If the system has no hardware bottlenecks, the indexing performance of full-text search mostly depends on the following:

  • Durée de création des traitements de texte intégral par SQL ServerSQL Server .How long it takes SQL ServerSQL Server to create full-text batches.

  • Rapidité d'utilisation de ces traitements par le démon de filtre.How quickly the filter daemon can consume those batches.

Problèmes liés à l’alimentation d’un index de recherche en texte intégralFull-text index population issues

  • Type d’alimentation.Type of population. Contrairement à un remplissage complet, le remplissage du suivi des modifications automatique, incrémentiel ou manuel n'a pas pour objectif de maximiser les ressources matérielles en vue d'obtenir une vitesse supérieure.Unlike full population, incremental, manual, and auto change tracking population are not designed to maximize hardware resources to achieve faster speed. Par conséquent, les suggestions de paramétrage fournies dans cette rubrique peuvent ne pas améliorer les performances de l’indexation de texte intégral lorsqu’une alimentation de suivi des modifications incrémentielle, manuelle ou automatique est utilisée.Therefore, the tuning suggestions in this topic may not enhance performance for full-text indexing when it uses incremental, manual, or auto change tracking population.

  • Fusion principale.Master merge. À la fin d'une alimentation, une fusion finale est déclenchée ; les fragments d'index sont fusionnés entre eux dans un index de recherche en texte intégral.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Il en résulte une amélioration des performances des requêtes dans la mesure où seul l'index principal doit être interrogé au lieu des fragments d'index ; par ailleurs, les statistiques de score sont plus appropriées pour un classement en fonction de la pertinence.This results in improved query performance since only the master index needs to be queried rather than a number of index fragments, and better scoring statistics may be used for relevance ranking. Toutefois, la fusion principale peut nécessiter de nombreuses entrées/sorties, car de grandes quantités de données doivent être écrites et lues lors de la fusion des fragments d’index, sans pour autant bloquer les requêtes entrantes.However the master merge can be I/O intensive, because large amounts of data must be written and read when index fragments are merged, though it does not block incoming queries.

    La fusion principale d'une grande quantité de données peut créer une transaction dont l'exécution est longue, ce qui retarde la troncation du journal des transactions pendant le point de contrôle.Master merging a large amount of data can create a long running transaction, delaying truncation of the transaction log during checkpoint. Dans ce cas, en mode de récupération complète, la taille du journal des transactions peut s'accroître considérablement.In this case, under the full recovery model, the transaction log might grow significantly. Avant de réorganiser un index de recherche en texte intégral de grande taille dans une base de données qui utilise le mode de récupération complète, il est fortement recommandé de vous assurer que votre journal des transactions contient un espace suffisant pour une transaction dont l'exécution est longue.As a best practice, before reorganizing a large full-text index in a database that uses the full recovery model, ensure that your transaction log contains sufficient space for a long-running transaction. Pour plus d’informations, consultez Gérer la taille du fichier journal des transactions.For more information, see Manage the Size of the Transaction Log File.

Améliorer les performances des index de recherche en texte intégral Tune the performance of full-text indexes

Pour optimiser les performances de vos index de recherche en texte intégral, appliquez les bonnes pratiques suivantes :To maximize the performance of your full-text indexes, implement the following best practices:

  • Pour utiliser tous les processeurs ou cœurs d’UC au maximum, définissez sp_configure 'max full-text crawl range' en lui affectant le nombre d’UC présentes dans le système.To use all CPU processors or cores to the maximum, set sp_configure 'max full-text crawl range' to the number of CPUs on the system. Pour plus d’informations sur cette option de configuration, consultez Maximum de la plage de l’analyse de texte intégral (option de configuration de serveur).For information about this configuration option, see max full-text crawl range Server Configuration Option.

  • Vérifiez si la table de base a un index cluster.Make sure that the base table has a clustered index. Utilisez un type de données entier pour la première colonne de l'index cluster.Use an integer data type for the first column of the clustered index. Évitez d'utiliser les GUID dans la première colonne de l'index cluster.Avoid using GUIDs in the first column of the clustered index. Un remplissage multiplage sur un index cluster peut produire la vitesse de remplissage la plus élevée.A multi-range population on a clustered index can produce the highest population speed. Nous recommandons que la colonne servant de clé de texte intégral corresponde à un type de données Integer.We recommend that the column serving as the full-text key be an integer data type.

  • Mettez à jour les statistiques de la table de base à l'aide de l'instruction UPDATE STATISTICS .Update the statistics of the base table by using the UPDATE STATISTICS statement. Le plus important est de mettre à jour les statistiques sur l'index cluster ou la clé de texte intégral pour un remplissage complet.More important, update the statistics on the clustered index or the full-text key for a full population. De cette manière, un remplissage sur plusieurs plages peut générer les partitions adéquates sur la table.This helps a multi-range population to generate good partitions on the table.

  • Avant d’effectuer une alimentation complète sur un ordinateur multiprocesseur de grande capacité, nous vous recommandons de limiter temporairement la taille du pool de mémoires tampons en définissant la valeur mémoire maximum du serveur de manière à laisser suffisamment de mémoire au processus fdhost.exe et au système d’exploitation.Before you perform a full population on a large multi-CPU computer, we recommend that you temporarily limit the size of the buffer pool by setting the max server memory value to leave enough memory for the fdhost.exe process and operating system use. Pour plus d'informations, consultez « Estimation des besoins en mémoire du processus hôte de démon de filtre (fdhost.exe) », plus loin dans cette rubrique.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic.

  • Si vous utilisez une alimentation incrémentielle basée sur une colonne timestamp, créez un index secondaire sur la colonne timestamp afin d’améliorer les performances de l’alimentation incrémentielle.If you use incremental population based on a timestamp column, build a secondary index on the timestamp column to improve the performance of incremental population.

Résoudre les problèmes de performances des alimentations complètes Troubleshoot the performance of full populations

Passer en revue les journaux d’analyse de texte intégralReview the full-text crawl logs

Pour mieux diagnostiquer les problèmes de performances, examinez les journaux d’analyse de texte intégral.To help diagnose performance problems, look at the full-text crawl logs.

Lorsqu'une erreur se produit durant une analyse, la fonction d'analyse de la recherche en texte intégral crée et conserve un journal de l'analyse sous forme de fichier texte.When an error occurs during a crawl, the Full-Text Search crawl logging facility creates and maintains a crawl log, which is a plain text file. Chaque journal de l'analyse correspond à un catalogue de texte intégral particulier.Each crawl log corresponds to a particular full-text catalog. Par défaut, les journaux d’analyse pour une instance donnée (dans cet exemple, l’instance par défaut) figurent dans le dossier %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG.By default, crawl logs for a given instance (in this example, the default instance) are located in %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG folder.

Le fichier journal de l'analyse respecte le modèle de dénomination suivant :The crawl log file follows the following naming scheme:

SQLFT<DatabaseID\><FullTextCatalogID\>.LOG[<n\>]

Les parties variables du nom de fichier du journal d’analyse sont les suivantes.The variable parts of the crawl log file name are the following.

  • <DatabaseID> - ID d’une base de données.<DatabaseID> - The ID of a database. <dbid> est un nombre à 5 chiffres commençant par des zéros non significatifs. <dbid> is a five digit number with leading zeros.
  • <FullTextCatalogID> - ID du catalogue de texte intégral.<FullTextCatalogID> - Full-text catalog ID. <catid> est un nombre à 5 chiffres commençant par des zéros non significatifs. <catid> is a five digit number with leading zeros.
  • <n> - Entier qui indique qu'il existe un ou plusieurs journaux d'analyse du même catalogue de texte intégral.<n> - Is an integer that indicates one or more crawl logs of the same full-text catalog exist.

    Par exemple, SQLFT0000500008.2 est le fichier journal d’analyse pour une base de données ayant un ID de base de données = 5 et un ID de catalogue de texte intégral = 8.For example, SQLFT0000500008.2 is the crawl log file for a database with database ID = 5, and full-text catalog ID = 8. Le 2 à la fin du nom de fichier indique qu'il existe deux fichiers journaux d'analyse pour cette combinaison base de données/catalogue.The 2 at the end of the file name indicates that there are two crawl log files for this database/catalog pair.

Vérifier l’utilisation de la mémoire physiqueCheck physical memory usage

Durant une alimentation de texte intégral, fdhost.exe ou sqlservr.exe peuvent manquer partiellement ou complètement de mémoire.During a full-text population, it is possible for fdhost.exe or sqlservr.exe to run low on memory or to run out of memory.

  • Si le journal d'analyse de texte intégral indique que fdhost.exe est souvent redémarré ou que le code d'erreur 8007008 est retourné, cela signifie que l'un de ces processus manque de mémoire.If the full-text crawl log shows that fdhost.exe is being restarted often or that error code 8007008 is being returned it means one of these processes is running out of memory.
  • Si fdhost.exe produit des vidages, en particulier sur des ordinateurs multiprocesseurs de grande capacité, cela peut signifier qu'il manque de mémoire.If fdhost.exe is producing dumps, particularly on large, multi-CPU computers, it might be running out of memory.
  • Pour obtenir des informations sur les mémoires tampons utilisées par une analyse de texte intégral, consultez sys.dm_fts_memory_buffers (Transact-SQL).To get information about memory buffers used by a full-text crawl, see sys.dm_fts_memory_buffers (Transact-SQL).

    Les causes possibles de problèmes de mémoire basse ou insuffisante sont les suivantes :The possible causes of low memory or out of memory issues are the following:

  • Mémoire insuffisante.Insufficient memory. Si la quantité de mémoire physique disponible pendant une alimentation complète est égale à zéro, le pool de mémoires tampons SQL ServerSQL Server consomme peut-être la plus grande part de la mémoire physique du système.If the amount of physical memory that is available during a full population is zero, the SQL ServerSQL Server buffer pool might be consuming most of the physical memory on the system.

    Le processus sqlservr.exe essaie de récupérer toute la mémoire disponible pour le pool de mémoires tampons, en fonction de la limite maximale de mémoire configurée pour le serveur.The sqlservr.exe process tries to grab all available memory for the buffer pool, up to the configured maximum server memory. Si l’allocation de mémoire maximum du serveur est trop importante, des insuffisances de mémoire et des échecs d’allocation de la mémoire partagée peuvent se produire pour le processus fdhost.exe.If the max server memory allocation is too large, out-of-memory conditions and failure to allocate shared memory can occur for the fdhost.exe process.

    Vous pouvez résoudre ce problème en définissant de façon appropriée la valeur mémoire maximum du serveur du pool de mémoires tampons SQL ServerSQL Server .You can solve this problem by setting the max server memory value of the SQL ServerSQL Server buffer pool appropriately. Pour plus d'informations, consultez « Estimation des besoins en mémoire du processus hôte de démon de filtre (fdhost.exe) », plus loin dans cette rubrique.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic. La réduction de la taille de lot utilisée pour l'indexation de texte intégral peut également s'avérer utile.Reducing the batch size used for full-text indexing may also help.

  • Contention de mémoire.Memory contention. Durant une alimentation de texte intégral sur un ordinateur multiprocesseur, il peut se produire un conflit de mémoire au niveau du pool de mémoires tampons pour fdhost.exe ou sqlservr.exe.During a full-text population on a multi-CPU computer, contention for the buffer pool memory can occur between fdhost.exe or sqlservr.exe. Le manque de mémoire partagée qui en résulte provoque des nouvelles tentatives d'exécution de lots, des surexploitations de la mémoire et des vidages par le processus fdhost.exe.The resulting lack of shared memory causes batch retries, memory thrashing, and dumps by the fdhost.exe process.

  • Problème de pagination.Paging issues. Si la taille du fichier d'échange est insuffisante, comme cela peut se produire sur un système qui dispose d'un petit fichier d'échange avec une croissance limitée, fdhost.exe ou sqlservr.exe risquent de manquer de mémoire.Insufficient page-file size, such as on a system that has a small page file with restricted growth, can also cause the fdhost.exe or sqlservr.exe to run out of memory. Si les journaux d'analyse n'indiquent pas de défaillances relatives à la mémoire, il est probable que les performances sont dégradées par une pagination excessive.If the crawl logs do not indicate any memory-related failures, it is likely that performance is slow due to excessive paging.

Estimer les besoins en mémoire du processus hôte de démon de filtre (fdhost.exe)Estimate the memory requirements of the Filter Daemon Host process (fdhost.exe)

La quantité de mémoire requise par le processus fdhost.exe pour une alimentation dépend principalement du nombre de plages d'analyses de texte intégral utilisées, de la taille de la mémoire partagée entrante et du nombre maximal d'instances relatives à la mémoire partagée entrante.The amount of memory required by the fdhost.exe process for a population depends mainly on the number of full-text crawl ranges it uses, the size of inbound shared memory (ISM), and the maximum number of ISM instances.

La quantité de mémoire consommée (en octets) par l'hôte de démon de filtre peut être estimée approximativement à l'aide de la formule suivante :The amount of memory (in bytes) consumed by the filter daemon host can be roughly estimated by using the following formula:

number_of_crawl_ranges * ism_size * max_outstanding_isms * 2

Les valeurs par défaut des variables contenues dans la formule précédente sont les suivantes :The default values of the variables in the preceding formula are as follows:

VariableVariable Valeur par défautDefault value
number_of_crawl_rangesnumber_of_crawl_ranges Nombre de processeursThe number of CPUs
ism_sizeism_size 1 Mo pour les ordinateurs x861 MB for x86 computers

4 Mo, 8 Mo ou 16 Mo pour les ordinateurs x64, en fonction de la mémoire physique totale4 MB, 8 MB, or 16MB for x64 computers, depending on the total physical memory
max_outstanding_ismsmax_outstanding_isms 25 pour les ordinateurs x8625 for x86 computers

5 pour les ordinateurs x645 for x64 computers

Le tableau suivant présente des indications expliquant comment estimer les besoins en mémoire de fdhost.exe.The following table presents guidelines about how to estimate the memory requirements of fdhost.exe. Les formules figurant dans ce tableau utilisent les valeurs suivantes :The formulas in this table use the following values:

  • F, qui est une évaluation de la mémoire requise par fdhost.exe (en Mo).F, which is an estimate of memory needed by fdhost.exe (in MB).

  • T, qui est la mémoire physique totale disponible sur le système (en Mo).T, which is the total physical memory available on the system (in MB).

  • M, qui correspond à la valeur mémoire maximum du serveur optimale.M, which is the optimal max server memory setting.

Pour obtenir des informations essentielles sur les formules suivantes, consultez les remarques qui suivent le tableau.For essential information about the following formulas, see the notes that follow the table.

PlateformePlatform Estimation des besoins en mémoire de fdhost.exe en Mo :F^1Estimating fdhost.exe memory requirements in MB—F^1 Formule de calcul de la mémoire maximum du serveur :M^2Formula for calculating max server memory—M^2
x86x86 F = Nombre de plages d’analyse * 50F = Number of crawl ranges * 50 M =minimum(T, 2000) – F – 500M =minimum(T, 2000) – F – 500
x64x64 F = Nombre de plages d’analyse * 10 * 8F = Number of crawl ranges * 10 * 8 M = TF – 500M = TF – 500

Remarques sur les formulesNotes about the formulas

  1. Si plusieurs alimentations complètes sont en cours, calculez séparément les besoins en mémoire de chaque processus fdhost.exe, comme F1, F2, etc.If multiple full populations are in progress, calculate the fdhost.exe memory requirements of each separately, as F1, F2, and so forth. Puis calculez M comme T sigma(Fi).Then calculate M as T sigma(Fi).
  2. 500 Mo est une estimation de la mémoire requise par les autres processus dans le système.500 MB is an estimate of the memory required by other processes in the system. Si le système effectue un travail supplémentaire, augmentez cette valeur en conséquence.If the system is doing additional work, increase this value accordingly.
  3. .ism_size est censé être de 8 Mo pour les plateformes x64..ism_size is assumed to be 8 MB for x64 platforms.

    Exemple : estimation des besoins en mémoire de fdhost.exeExample: Estimate the memory requirements of fdhost.exe

    Cet exemple se rapporte à un ordinateur 64 bits avec 8 Go de mémoire vive (RAM) et 4 processeurs double cœur.This example is for an 64-bit computer that has 8GM of RAM and 4 dual core processors. Les premières estimations de calcul de la mémoire requise par fdhost.exe :F.The first calculation estimates of memory needed by fdhost.exe—F. Le nombre de plages d'analyse est 8.The number of crawl ranges is 8.

    F = 8*10*8=640

    Le calcul suivant obtient la valeur optimale de mémoire maximum du serveurM.The next calculation obtains the optimal value for max server memoryM. *La mémoire physique totale disponible sur ce système en Mo—T—est 8192.The total physical memory available on this system in MB—T*—is 8192.

    M = 8192-640-500=7052

    Exemple : configuration de la mémoire maximum du serveurExample: Setting max server memory

    Cet exemple utilise les instructions sp_configure et RECONFIGURE Transact-SQLTransact-SQL pour définir mémoire maximum du serveur sur la valeur calculée pour M dans l’exemple précédent, 7052:This example uses the sp_configure and RECONFIGURE Transact-SQLTransact-SQL statements to set max server memory to the value calculated for M in the preceding example, 7052:

USE master;  
GO  
EXEC sp_configure 'max server memory', 7052;  
GO  
RECONFIGURE;  
GO  

Pour plus d’informations sur les options de mémoire du serveur, consultez Mémoire du serveur (option de configuration de serveur).For more info about the server memory options, see Server Memory Server Configuration Options.

Vérifier l’utilisation de l’UCCheck CPU usage

Les performances des alimentations complètes ne sont pas optimales lorsque la consommation processeur moyenne est inférieure à environ 30 %.The performance of full populations is not optimal when the average CPU consumption is lower than about 30 percent. Voici quelques facteurs qui affectent la consommation processeur.Here are some factors that affect CPU consumption.

  • Temps d’attente élevé pour les pagesHigh wait time for pages

    Pour déterminer si le temps d’attente d’une page est élevé, exécutez l’instruction Transact-SQLTransact-SQL suivante :To find out whether a page wait time is high, run the following Transact-SQLTransact-SQL statement:

    Execute SELECT TOP 10 * FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC;  
    

    Le tableau suivant décrit les types de temps d'attente présentant un intérêt ici.The following table describes the wait types of interest here.

    Type d’attenteWait type DescriptionDescription Résolution possiblePossible resolution
    PAGEIO_LATCH_SH (_EX ou _UP)PAGEIO_LATCH_SH (_EX or _UP) Cela pourrait indiquer un goulet d'étranglement ES, auquel cas vous devriez généralement constater également une durée de file d'attente de disque moyenne élevée.This could indicate an IO bottleneck, in which case you would typically also see a high average disk-queue length. Le déplacement de l'index de recherche en texte intégral vers un groupe de fichiers différent sur un disque différent peut aider à réduire le goulet d'étranglement ES.Moving the full-text index to a different filegroup on a different disk could help reduce the IO bottleneck.
    PAGELATCH_EX (ou _UP)PAGELATCH_EX (or _UP) Cela pourrait indiquer beaucoup de contention parmi les threads qui essaient d'écrire dans le même fichier de base de données.This could indicate a lot of contention among threads that are trying to write to the same database file. L'ajout des fichiers au groupe de fichiers sur lequel l'index de texte intégral réside pourrait aider à alléger cette contention.Adding files to the filegroup on which the fulltext index resides could help alleviate such contention.

    Pour plus d’informations, consultez sys.dm_os_wait_stats (Transact-SQL).For more info, see sys.dm_os_wait_stats (Transact-SQL).

  • Inefficacités dans l'analyse de la table de baseInefficiencies in scanning the base table

    Un remplissage complet analyse la table de base pour produire des lots.A full population scans the base table to produce batches. Cette analyse de table peut être inefficace dans les scénarios suivantes :This table scanning could be inefficient in the following scenarios:

    • Si la table de base a un pourcentage élevé de colonnes hors ligne qui sont indexées de texte intégral, l'analyse de la table de base pour produire des lots peut être le goulet d'étranglement.If the base table has a high percentage of out-of-row columns that are being full-text indexed, scanning the base table to produce batches might be the bottleneck. Dans ce cas, le déplacement des petites données dans la ligne à l’aide de varchar(max) ou nvarchar(max) peut améliorer la situation.In this case, moving the smaller data in-row using varchar(max) or nvarchar(max) might help.

    • Si la table de base est très fragmentée, l'analyse peut être inefficace.If the base table is very fragmented, scanning might be inefficient. Pour obtenir des informations sur le calcul des données hors ligne et de la fragmentation des index, consultez sys.dm_db_partition_stats (Transact-SQL) et sys.dm_db_index_physical_stats (Transact-SQL).For information about computing out-of-row data and index fragmentation, see sys.dm_db_partition_stats (Transact-SQL) and sys.dm_db_index_physical_stats (Transact-SQL).

      Pour réduire la fragmentation, vous pouvez réorganiser ou reconstruire l'index cluster.To reduce fragmentation, you can reorganize or rebuild the clustered index. Pour plus d’informations, consultez Réorganiser et reconstruire des index.For more information, see Reorganize and Rebuild Indexes.

Résoudre les problèmes de ralentissement de l’indexation des documents Troubleshoot slow indexing of documents

Note

Cette section décrit un problème qui affecte uniquement les clients qui indexent des documents (tels que les documents Microsoft Word) qui incorporent d’autres types de documents.This section describes an issue that only affects customers who index documents (such as Microsoft Word documents) in which other document types are embedded.

Le moteur d’indexation et de recherche en texte intégral utilise deux types de filtres lorsqu’il remplit un index de recherche en texte intégral : des filtres multithreads et des filtres monothreads.The Full-Text Engine uses two types of filters when it populates a full-text index: multithreaded filters and single-threaded filters.

  • Certains documents, tels que les documents MicrosoftMicrosoft Word, sont filtrés à l'aide d'un filtre multithread.Some documents, such as MicrosoftMicrosoft Word documents, are filtered using a multithreaded filter.
  • D'autres, tels que les documents PDF (Portable Document Format) d'Adobe Acrobat, sont filtrés à l'aide d'un filtre monothread.Other documents, such as Adobe Acrobat Portable Document Format (PDF) documents, are filtered using a single-threaded filter.

    Pour des raisons de sécurité, les filtres sont chargés par les processus hôtes de démon de filtre.For security reasons, filters are loaded by the filter daemon host processes. Une instance de serveur utilise un processus multithread pour tous les filtres multithreads et un processus monothread pour tous les filtres monothreads.A server instance uses a multithreaded process for all multithreaded filters and a single-threaded process for all single-threaded filters. Lorsqu'un document qui utilise un filtre multithread contient un document incorporé qui utilise un filtre monothread, le Moteur d'indexation et de recherche en texte intégral lance un processus monothread pour le document incorporé.When a document that uses a multithreaded filter contains an embedded document that uses a single-threaded filter, the Full-Text Engine launches a single-threaded process for the embedded document. Par exemple, quand il rencontre un document Word qui contient un document PDF, le Moteur d’indexation et de recherche en texte intégral utilise le processus multithread pour le contenu Word et lance un processus monothread pour le contenu PDF.For example, on encountering a Word document that contains a PDF document, the Full-Text Engine uses the multithreaded process for the Word content and launches a single-threaded process for the PDF content. Toutefois, un filtre monothread peut ne pas fonctionner correctement dans cet environnement et peut déstabiliser le processus de filtrage.A single-threaded filter might not work well in this environment, however, and could destabilize the filtering process. Dans certaines circonstances, lorsque ce type d’incorporation est courant, cette déstabilisation peut provoquer des blocages du processus.In certain circumstances where such embedding is common, destabilization might lead to crashes of the process. Dans ce cas, le moteur d’indexation et de recherche en texte intégral réachemine tout document ayant subi un échec (par exemple, un document Word incorporant un contenu PDF) vers le processus de filtrage monothread.When this occurs, the Full-Text Engine re-routes any failed document - for example, a Word document that contains embedded PDF content - to the single-threaded filtering process. Si le réacheminement a lieu fréquemment, il en résulte une détérioration des performances du processus d'indexation de texte intégral.If re-routing occurs frequently, it results in performance degradation of the full-text indexing process.

Pour contourner ce problème, marquez le filtre du document conteneur (le document Word dans cet exemple) en tant que filtre monothread.To work around this problem, mark the filter for the container document (the Word document, in this example) as a single-threaded filter. Pour ce faire, définissez la valeur de Registre ThreadingModel pour le filtre en spécifiant Thread cloisonné.To mark a filter as a single-threaded filter, set the ThreadingModel registry value for the filter to Apartment Threaded. Pour plus d’informations sur les threads uniques cloisonnés (STA), consultez le livre blanc intitulé Présentation et utilisation des modèles de threads COM.For information about single-threaded apartments, see the white paper Understanding and Using COM Threading Models.

Voir aussiSee Also

Mémoire du serveur (option de configuration de serveur) Server Memory Server Configuration Options
Maximum de la plage de l’analyse de texte intégral (option de configuration de serveur) max full-text crawl range Server Configuration Option
Alimenter des index de recherche en texte intégral Populate Full-Text Indexes
Créer et gérer des index de recherche en texte intégral Create and Manage Full-Text Indexes
sys.dm_fts_memory_buffers (Transact-SQL) sys.dm_fts_memory_buffers (Transact-SQL)
sys.dm_fts_memory_pools (Transact-SQL) sys.dm_fts_memory_pools (Transact-SQL)
Résoudre l'indexation de recherche en texte intégralTroubleshoot Full-Text Indexing