Miglioramento delle prestazioni di indici full-textImprove the Performance of Full-Text Indexes

Questo argomento descrive alcune delle cause comuni della riduzione delle prestazioni per gli indici e le query full-text.This topic describes some of the common causes of poor performance for full-text indexes and queries. Vengono inoltre forniti alcuni suggerimenti per limitare i problemi e migliorare le prestazioni.It also provides a few suggestions to mitigate these issues and improve performance.

Common causes of performance issues Common causes of performance issues

Problemi relativi alle risorse hardwareHardware resource issues

Le prestazioni di esecuzione dell'indicizzazione e delle query full-text possono dipendere da risorse hardware quali memoria e velocità del disco e della CPU, nonché dall'architettura del computer.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 causa principale del calo delle prestazioni di esecuzione dell'indicizzazione full-text è data dai limiti delle risorse hardware.The main cause for reduced full-text indexing performance is hardware-resource limits.

  • CPU.CPU. Se l'uso della CPU da parte del processo host del daemon di filtri (fdhost.exe) o del processo SQL ServerSQL Server (sqlservr.exe) ha quasi raggiunto il 100%, il collo di bottiglia è rappresentato dalla CPU stessa.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.

  • Memoria.Memory. In caso di memoria fisica insufficiente, il collo di bottiglia è rappresentato dalla memoria.If there is a shortage of physical memory, memory might be the bottleneck.

  • Disco.Disk. Se la lunghezza media della coda di attesa del disco è superiore al doppio del numero di testine, il collo di bottiglia è rappresentato dal disco.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 soluzione alternativa principale consiste nella creazione di cataloghi full-text separati dai file e dai log del database di SQL ServerSQL Server .The primary workaround is to create full-text catalogs that are separate from the SQL ServerSQL Server database files and logs. Posizionare i log, i file di database e i cataloghi full-text su dischi separati.Put the logs, database files, and full-text catalogs on separate disks. Per migliorare le prestazioni di esecuzione dell'indicizzazione, è inoltre possibile installare dischi più veloci e usare RAID.Installing faster disks and using RAID can also help improve indexing performance.

    Nota

    A partire da SQL Server 2008SQL Server 2008, il motore di ricerca full-text può usare memoria AWE, in quanto parte del processo 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.

Problemi relativi ai batch full-textFull-text batching issues

Se nel sistema non vengono rilevati colli di bottiglia a livello dell'hardware, le prestazioni di indicizzazione della ricerca full-text dipendono principalmente dagli elementi seguenti:If the system has no hardware bottlenecks, the indexing performance of full-text search mostly depends on the following:

  • Tempo necessario per la creazione di batch full-text in SQL ServerSQL Server .How long it takes SQL ServerSQL Server to create full-text batches.

  • Velocità di utilizzo di tali batch da parte del daemon di filtri.How quickly the filter daemon can consume those batches.

Problemi relativi al popolamento dell'indice full-textFull-text index population issues

  • Tipo di popolamento.Type of population. A differenza del popolamento completo, i popolamenti incrementale, manuale e con rilevamento automatico delle modifiche non sono progettati per ottimizzare le risorse hardware ai fini di una maggiore velocità.Unlike full population, incremental, manual, and auto change tracking population are not designed to maximize hardware resources to achieve faster speed. Di conseguenza, i suggerimenti per l'ottimizzazione in questo argomento potrebbero non migliorare le prestazioni per l'indicizzazione full-text quando si usa il popolamento incrementale, manuale o con rilevamento automatico delle modifiche.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.

  • Unione nell'indice master.Master merge. Al termine di un popolamento, viene attivato un processo di unione conclusivo che associa i frammenti di indice in un singolo indice full-text master.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Ciò consente prestazioni di query superiori poiché è necessario eseguire query solo sull'indice master anziché su alcuni frammenti di indice ed è possibile utilizzare statistiche di punteggio migliori per la classificazione della pertinenza.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. Tuttavia, l'unione nell'indice master può richiedere l'esecuzione di molte operazioni di I/O, in quanto è necessario leggere e scrivere grandi quantità di dati, ma questa operazione non blocca le query in entrata.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.

    L'unione nell'indice master di una grande quantità di dati può comportare la creazione di una transazione con esecuzione prolungata, con il conseguente ritardo del troncamento del log delle transazioni durante il checkpoint.Master merging a large amount of data can create a long running transaction, delaying truncation of the transaction log during checkpoint. In questo caso, le dimensioni del log delle transazioni potrebbero aumentare notevolmente, se si utilizza il modello di recupero con registrazione completa.In this case, under the full recovery model, the transaction log might grow significantly. È consigliabile verificare che il log delle transazioni contenga spazio sufficiente per una transazione con esecuzione prolungata prima di riorganizzare un indice full-text di grandi dimensioni in un database in cui viene utilizzato il modello di recupero con registrazione completa.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. Per altre informazioni, vedere Gestione delle dimensioni del file di log delle transazioni.For more information, see Manage the Size of the Transaction Log File.

Ottimizzare le prestazioni degli indici full-text Tune the performance of full-text indexes

Per ottimizzare le prestazioni degli indici full-text, implementare le procedure consigliate seguenti:To maximize the performance of your full-text indexes, implement the following best practices:

  • Per usare al meglio tutti i processori o i core CPU, impostare sp_configure 'max full-text crawl range' sul numero di CPU nel sistema.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. Per informazioni su questa opzione di configurazione, vedere Opzione di configurazione del server max full-text crawl range.For information about this configuration option, see max full-text crawl range Server Configuration Option.

  • Verificare che la tabella di base includa un indice cluster.Make sure that the base table has a clustered index. Utilizzare un tipo di dati integer per la prima colonna dell'indice cluster.Use an integer data type for the first column of the clustered index. Evitare l'utilizzo di GUID nella prima colonna dell'indice cluster.Avoid using GUIDs in the first column of the clustered index. Un popolamento a più intervalli in un indice cluster garantisce la massima velocità di popolamento.A multi-range population on a clustered index can produce the highest population speed. È consigliabile che la colonna utilizzata come chiave full-text sia di un tipo di dati integer.We recommend that the column serving as the full-text key be an integer data type.

  • Aggiornare le statistiche della tabella di base utilizzando l'istruzione UPDATE STATISTICS .Update the statistics of the base table by using the UPDATE STATISTICS statement. Un'operazione ancora più importante consiste nell'aggiornamento delle statistiche nell'indice cluster o nella chiave full-text per un popolamento completo.More important, update the statistics on the clustered index or the full-text key for a full population. In questo modo, tramite un popolamento a più intervalli è possibile generare partizioni ottimali nella tabella.This helps a multi-range population to generate good partitions on the table.

  • Prima di eseguire un popolamento completo in un computer di grandi dimensioni con più CPU, è consigliabile limitare temporaneamente la dimensione del pool di buffer impostando il valore di max server memory in modo tale da lasciare una quantità di memoria sufficiente per il processo fdhost.exe e il sistema operativo.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. Per ulteriori informazioni, vedere "Stima dei requisiti di memoria del processo host del daemon di filtri (fdhost.exe)" più avanti in questo argomento.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic.

  • Se si usa il popolamento incrementale basato su una colonna timestamp, compilare un indice secondario sulla colonna timestamp per migliorare le prestazioni di esecuzione del popolamento incrementale.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.

Risolvere i problemi relativi alle prestazioni di popolamenti completi Troubleshoot the performance of full populations

Esaminare i log di ricerca per indicizzazione full-textReview the full-text crawl logs

Per diagnosticare problemi di prestazioni, analizzare i log della ricerca per indicizzazione full-text.To help diagnose performance problems, look at the full-text crawl logs.

Quando si verifica un errore durante una ricerca per indicizzazione, la funzionalità di registrazione corrispondente per la ricerca full-text crea e gestisce un log di tipo ricerca per indicizzazione in formato testo normale.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. Ogni log di tipo ricerca per indicizzazione corrisponde a un catalogo full-text specifico.Each crawl log corresponds to a particular full-text catalog. Per impostazione predefinita, i log di ricerca per indicizzazione per un'istanza specifica, ad esempio l'istanza predefinita, si trovano nella cartella %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.

Il file del log di tipo ricerca per indicizzazione segue lo schema di denominazione seguente:The crawl log file follows the following naming scheme:

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

Di seguito sono riportate le parti variabili del nome del file del log di ricerca per indicizzazione.The variable parts of the crawl log file name are the following.

  • <IDDatabase>: ID di un database.<DatabaseID> - The ID of a database. <dbid> è un numero a cinque cifre con zeri iniziali. <dbid> is a five digit number with leading zeros.
  • <IDCatalogoFullText>: ID del catalogo full-text.<FullTextCatalogID> - Full-text catalog ID. <catid> è un numero a cinque cifre con zeri iniziali. <catid> is a five digit number with leading zeros.
  • <n>: numero intero che indica l'esistenza di uno o più log di tipo ricerca per indicizzazione per lo stesso catalogo full-text.<n> - Is an integer that indicates one or more crawl logs of the same full-text catalog exist.

    Ad esempio, SQLFT0000500008.2 è il file del log di ricerca per indicizzazione per un database con ID database = 5 e ID catalogo full-text = 8.For example, SQLFT0000500008.2 is the crawl log file for a database with database ID = 5, and full-text catalog ID = 8. Il 2 alla fine del nome file indica che sono disponibili due file del log di tipo ricerca per indicizzazione per questa coppia di database/catalogo.The 2 at the end of the file name indicates that there are two crawl log files for this database/catalog pair.

Controllare l'utilizzo della memoria fisicaCheck physical memory usage

Durante un popolamento full-text, è possibile che la memoria disponibile per fdhost.exe o sqlservr.exe diventi insufficiente o si esaurisca.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.

  • Se il log delle ricerche per indicizzazione full-text indica il riavvio frequente del processo fdhost.exe o la restituzione frequente del codice di errore 8007008, uno di questi processi non dispone di memoria sufficiente.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.
  • Se fdhost.exe produce dump, in particolare in computer di grandi dimensioni con più CPU, è possibile che la memoria si esaurisca.If fdhost.exe is producing dumps, particularly on large, multi-CPU computers, it might be running out of memory.
  • Per ottenere informazioni sui buffer di memoria usati da una ricerca per indicizzazione full-text, vedere 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).

    Di seguito sono elencate le possibili cause di memoria insufficiente:The possible causes of low memory or out of memory issues are the following:

  • Memoria insufficiente.Insufficient memory. Se la quantità di memoria fisica disponibile durante un popolamento completo è pari a zero, è possibile che il pool di buffer di SQL ServerSQL Server stia utilizzando la maggior parte della memoria fisica presente nel sistema.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.

    Il processo sqlservr.exe tenta di acquisire tutta la memoria disponibile per il pool di buffer, fino alla quantità massima di memoria del server configurata.The sqlservr.exe process tries to grab all available memory for the buffer pool, up to the configured maximum server memory. Se l'allocazione di max server memory è eccessiva, per il processo fdhost.exe possono verificarsi condizioni di memoria insufficiente e l'impossibilità di allocare memoria condivisa.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.

    È possibile risolvere questo problema impostando in modo appropriato il valore max server memory del pool di buffer di SQL ServerSQL Server .You can solve this problem by setting the max server memory value of the SQL ServerSQL Server buffer pool appropriately. Per ulteriori informazioni, vedere "Stima dei requisiti di memoria del processo host del daemon di filtri (fdhost.exe)" più avanti in questo argomento.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic. Può inoltre risultare utile ridurre la dimensione del batch per l'indicizzazione full-text.Reducing the batch size used for full-text indexing may also help.

  • Contesa di memoria.Memory contention. Durante un popolamento full-text in un computer con più CPU, tra fdhost.exe e sqlservr.exe può verificarsi una contesa per la memoria del pool di buffer.During a full-text population on a multi-CPU computer, contention for the buffer pool memory can occur between fdhost.exe or sqlservr.exe. La conseguente mancanza di memoria condivisa genera tentativi batch, sovraccarico della memoria e dump da parte del processo fdhost.exe.The resulting lack of shared memory causes batch retries, memory thrashing, and dumps by the fdhost.exe process.

  • Problemi di paging.Paging issues. Anche le dimensioni insufficienti del file di paging, ad esempio in un sistema con un file di paging ridotto con crescita limitata, possono generare condizioni di memoria insufficiente per fdhost.exe o sqlservr.exe.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. Se nei log delle ricerche per indicizzazione full-text non sono riportati errori di memoria, è probabile che le prestazioni non siano ottimali a causa del paging eccessivo.If the crawl logs do not indicate any memory-related failures, it is likely that performance is slow due to excessive paging.

Stimare i requisiti di memoria per il processo host del daemon di filtri (fdhost.exe)Estimate the memory requirements of the Filter Daemon Host process (fdhost.exe)

La quantità di memoria richiesta dal processo fdhost.exe per un popolamento dipende principalmente dal numero di intervalli di ricerca per indicizzazione full-text utilizzati, dalla dimensione della memoria condivisa in ingresso e dal numero massimo di istanze di tale memoria.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.

È possibile stimare approssimativamente la quantità di memoria (in byte) utilizzata dall'host del daemon di filtri tramite la formula seguente: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

I valori predefiniti delle variabili nella formula precedente sono i seguenti:The default values of the variables in the preceding formula are as follows:

VariabileVariable Valore predefinitoDefault value
number_of_crawl_rangesnumber_of_crawl_ranges Numero di CPUThe number of CPUs
ism_sizeism_size 1 MB per computer x861 MB for x86 computers

4 MB, 8 MB o 16 MB per computer x64, a seconda della memoria fisica totale4 MB, 8 MB, or 16MB for x64 computers, depending on the total physical memory
max_outstanding_ismsmax_outstanding_isms 25 per computer x8625 for x86 computers

5 per computer x645 for x64 computers

Nella tabella seguente vengono illustrate le linee guida da seguire per stimare i requisiti di memoria di fdhost.exe.The following table presents guidelines about how to estimate the memory requirements of fdhost.exe. Le formule contenute in questa tabella utilizzano i valori riportati di seguito.The formulas in this table use the following values:

  • F: stima della memoria richiesta da fdhost.exe (in MB).F, which is an estimate of memory needed by fdhost.exe (in MB).

  • T: memoria fisica totale disponibile nel sistema (in MB).T, which is the total physical memory available on the system (in MB).

  • M: impostazione ottimale per max server memory .M, which is the optimal max server memory setting.

Per informazioni essenziali sulle formule seguenti, vedere le note dopo la tabella.For essential information about the following formulas, see the notes that follow the table.

PiattaformaPlatform Stima dei requisiti di memoria di fdhost.exe in MB:F^1Estimating fdhost.exe memory requirements in MB—F^1 Formula per il calcolo di max server memory:M^2Formula for calculating max server memory—M^2
x86x86 F = Numero di intervalli di ricerca per indicizzazione * 50F = Number of crawl ranges * 50 M =minimo(T, 2000) – F – 500M =minimum(T, 2000) – F – 500
x64x64 F = Numero di intervalli di ricerca per indicizzazione * 10 * 8F = Number of crawl ranges * 10 * 8 M = TF – 500M = TF – 500

Note sulle formuleNotes about the formulas

  1. Se sono in corso più popolamenti completi, calcolare i requisiti di memoria di fdhost.exe per ciascuno separatamente, ad esempio F1, F2 e così via.If multiple full populations are in progress, calculate the fdhost.exe memory requirements of each separately, as F1, F2, and so forth. Calcolare quindi M come T sigma(Fi).Then calculate M as T sigma(Fi).
  2. 500 MB è una stima della memoria necessaria per gli altri processi del sistema.500 MB is an estimate of the memory required by other processes in the system. Se nel sistema sono in corso processi aggiuntivi, aumentare questo valore di conseguenza.If the system is doing additional work, increase this value accordingly.
  3. .ism_size sia 8 MB per le piattaforme x64..ism_size is assumed to be 8 MB for x64 platforms.

    Esempio: Stima dei requisiti di memoria di fdhost.exeExample: Estimate the memory requirements of fdhost.exe

    Questo esempio è relativo a un computer a 64 bit con 8 GB di RAM e 4 processori dual core.This example is for an 64-bit computer that has 8GM of RAM and 4 dual core processors. Il primo calcolo consente di stimare i requisiti di memoria di fdhost.exe, ovveroF.The first calculation estimates of memory needed by fdhost.exe—F. Il numero di intervalli di ricerca per indicizzazione è 8.The number of crawl ranges is 8.

    F = 8*10*8=640

    Il calcolo successivo ottiene il valore ottimale per max server memoryM.The next calculation obtains the optimal value for max server memoryM. La memoria fisica totale disponibile su questo sistema in MB—T—è 8192.The total physical memory available on this system in MB—T—is 8192.

    M = 8192-640-500=7052

    Esempio: Impostazione del valore max server memoryExample: Setting max server memory

    Questo esempio usa le istruzioni sp_configure e RECONFIGURE Transact-SQLTransact-SQL per impostare max server memory sul valore calcolato per M nell'esempio precedente, 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  

Per altre informazioni sulle opzioni per la memoria del server, vedere Opzioni di configurazione del server Server Memory.For more info about the server memory options, see Server Memory Server Configuration Options.

Controllare l'utilizzo della CPUCheck CPU usage

Le prestazioni di esecuzione dei popolamenti completi non sono ottimali quando l'utilizzo medio della CPU è inferiore al 30%.The performance of full populations is not optimal when the average CPU consumption is lower than about 30 percent. Di seguito vengono illustrati alcuni fattori che influiscono sull'utilizzo della CPU.Here are some factors that affect CPU consumption.

  • Tempi di attesa lunghi delle pagineHigh wait time for pages

    Per determinare il tempo di attesa delle pagine, eseguire l'istruzione Transact-SQLTransact-SQL seguente: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;  
    

    Nella tabella seguente vengono descritti i tipi di attesa relativi a questo contesto.The following table describes the wait types of interest here.

    Tipo di attesaWait type DescrizioneDescription Possibile soluzionePossible resolution
    PAGEIO_LATCH_SH (_EX o _UP)PAGEIO_LATCH_SH (_EX or _UP) Può indicare un collo di bottiglia a livello di IO, caso in cui anche la lunghezza media della coda del disco sarebbe elevata.This could indicate an IO bottleneck, in which case you would typically also see a high average disk-queue length. Lo spostamento dell'indice full-text in un filegroup diverso in un disco diverso potrebbe contribuire a ridurre il collo di bottiglia a livello di IO.Moving the full-text index to a different filegroup on a different disk could help reduce the IO bottleneck.
    PAGELATCH_EX (o _UP)PAGELATCH_EX (or _UP) Può indicare contese tra i thread che tentano di scrivere nello stesso file di database.This could indicate a lot of contention among threads that are trying to write to the same database file. L'aggiunta di file al filegroup in cui risiede l'indice full-text potrebbe contribuire ad attenuare queste contese.Adding files to the filegroup on which the fulltext index resides could help alleviate such contention.

    Per altre informazioni, vedere sys.dm_os_wait_stats (Transact-SQL).For more info, see sys.dm_os_wait_stats (Transact-SQL).

  • Analisi inefficaci della tabella di baseInefficiencies in scanning the base table

    Un popolamento completo esegue l'analisi della tabella di base per produrre batch.A full population scans the base table to produce batches. Tali analisi potrebbero risultare inefficaci negli scenari seguenti:This table scanning could be inefficient in the following scenarios:

    • Se la tabella di base dispone di una percentuale elevata di colonne esterne alle righe sottoposte a indicizzazione full-text, il collo di bottiglia potrebbe essere causato proprio dall'analisi della tabella di base per produrre batch.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. In questo caso, lo spostamento dei dati di dimensioni inferiori all'interno delle righe tramite varchar(max) o nvarchar(max) potrebbe risolvere il problema.In this case, moving the smaller data in-row using varchar(max) or nvarchar(max) might help.

    • Se la tabella di base è molto frammentata, l'analisi potrebbe risultare inefficace.If the base table is very fragmented, scanning might be inefficient. Per informazioni sul calcolo dei dati esterni alle righe e sulla frammentazione dell'indice, vedere sys.dm_db_partition_stats (Transact-SQL) e 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).

      Per ridurre la frammentazione, è possibile riorganizzare o ricompilare l'indice cluster.To reduce fragmentation, you can reorganize or rebuild the clustered index. Per altre informazioni, vedere Riorganizzare e ricompilare gli indici.For more information, see Reorganize and Rebuild Indexes.

Risolvere i problemi relativi all'indicizzazione lenta dei documenti Troubleshoot slow indexing of documents

Nota

Questa sezione descrive un problema che riguarda solo gli utenti che indicizzano documenti (ad esempio documenti di Microsoft Word) in cui sono incorporati altri tipi di documento.This section describes an issue that only affects customers who index documents (such as Microsoft Word documents) in which other document types are embedded.

Il motore di ricerca full-text usa due tipi di filtri durante il popolamento di un indice full-text: a thread singolo e multithread.The Full-Text Engine uses two types of filters when it populates a full-text index: multithreaded filters and single-threaded filters.

  • Alcuni documenti, quali i documenti di MicrosoftMicrosoft Word, vengono filtrati utilizzando un filtro multithread,Some documents, such as MicrosoftMicrosoft Word documents, are filtered using a multithreaded filter.
  • mentre altri, ad esempio i documenti PDF (Portable Document Format) di Adobe Acrobat, vengono filtrati utilizzando un filtro a thread singolo.Other documents, such as Adobe Acrobat Portable Document Format (PDF) documents, are filtered using a single-threaded filter.

    Ai fini della sicurezza, i filtri vengono caricati dai processi dell'host del daemon di filtri.For security reasons, filters are loaded by the filter daemon host processes. In un'istanza del server viene utilizzato un processo a thread multipli per tutti i filtri a thread multipli e un processo a thread singolo per tutti i filtri a thread singolo.A server instance uses a multithreaded process for all multithreaded filters and a single-threaded process for all single-threaded filters. Quando un documento che utilizza un filtro multithread contiene un documento incorporato che utilizza un filtro a thread singolo, il motore di ricerca full-text avvia un processo a thread singolo per il documento incorporato.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. Nel caso di un documento di Word che contiene un documento PDF, il motore di ricerca full-text usa il processo multithread per esaminare il contenuto in formato Word e avvia un processo a thread singolo per esaminare il contenuto in formato 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. Un filtro a thread singolo potrebbe tuttavia non funzionare in modo corretto in questo ambiente e potrebbe destabilizzare il processo di filtraggio.A single-threaded filter might not work well in this environment, however, and could destabilize the filtering process. In alcune situazioni in cui i documenti incorporati rappresentano una prassi comune, la destabilizzazione potrebbe causare arresti anomali del processo.In certain circumstances where such embedding is common, destabilization might lead to crashes of the process. In questo caso, il motore di ricerca full-text reindirizza tutti i documenti che hanno provocato l'errore, ad esempio un documento di Word in cui è incorporato contenuto in formato PDF, al processo di filtraggio a thread singolo.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. Se il reindirizzamento viene eseguito di frequente, le prestazioni del processo di indicizzazione full-text risultano ridotte.If re-routing occurs frequently, it results in performance degradation of the full-text indexing process.

Per risolvere questo problema, è necessario contrassegnare il filtro per il documento contenitore, in questo esempio il documento di Word, come filtro a thread singolo.To work around this problem, mark the filter for the container document (the Word document, in this example) as a single-threaded filter. Per contrassegnare un filtro come filtro a thread singolo, impostare il valore ThreadingModel del Registro di sistema per il filtro su Apartment Threaded.To mark a filter as a single-threaded filter, set the ThreadingModel registry value for the filter to Apartment Threaded. Per informazioni sugli apartment a thread singolo, vedere il white paper Understanding and Using COM Threading Models.For information about single-threaded apartments, see the white paper Understanding and Using COM Threading Models.

Vedere ancheSee Also

Opzioni di configurazione del server Server Memory Server Memory Server Configuration Options
Opzione di configurazione del server max full-text crawl range max full-text crawl range Server Configuration Option
Popolamento degli indici full-text Populate Full-Text Indexes
Creazione e gestione di indici full-text 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)
Risoluzione dei problemi nell'indicizzazione full-textTroubleshoot Full-Text Indexing