Verbessern der Leistung von VolltextindizesImprove the Performance of Full-Text Indexes

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

In diesem Thema werden einige häufige Ursachen für eine geringe Leistung für Volltextindizes und -Abfragen beschrieben.This topic describes some of the common causes of poor performance for full-text indexes and queries. Darüber hinaus werden einige Vorschläge für das Verringern dieser Probleme und das Verbessern der Leistung gemacht.It also provides a few suggestions to mitigate these issues and improve performance.

Common causes of performance issuesCommon causes of performance issues

Probleme mit HardwareHardware resource issues

Die Leistung für Volltextindizes und Volltextabfragen wird von den Hardwareressourcen wie Arbeitsspeicher, Datenträgergeschwindigkeit, CPU-Geschwindigkeit und Computerarchitektur beeinflusst.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.

Der Hauptgrund für eine eingeschränkte Leistung beim Erstellen von Volltextindizes sind Einschränkungen bei den Hardwareressourcen:The main cause for reduced full-text indexing performance is hardware-resource limits.

  • CPUCPU. Wenn die CPU-Nutzung des Filterdaemon-Hostprozesses (fdhost.exe) oder des SQL ServerSQL Server -Prozesses (sqlservr.exe) fast 100 % beträgt, dann ist die CPU der Engpass.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.

  • SpeicherMemory. Wenn ein Mangel an physischem Speicher besteht, kann ggf. der Arbeitsspeicher der Engpass sein.If there is a shortage of physical memory, memory might be the bottleneck.

  • Datenträger.Disk. Wenn die durchschnittliche Warteschlangenlänge des Datenträgers zweimal so groß wie die Anzahl von Leseköpfen ist, dann besteht ein Engpass auf dem Datenträger.If the average disk-waiting queue length is more than two times the number of disk heads, there is a bottleneck on the disk. Die erste Problemumgehung ist das Erstellen von Volltextkatalogen, die getrennt von den SQL ServerSQL Server -Datenbankendateien und -protokollen sind.The primary workaround is to create full-text catalogs that are separate from the SQL ServerSQL Server database files and logs. Platzieren Sie Protokolle, die Datenbankdateien und Volltextkataloge auf getrennten Datenträgern.Put the logs, database files, and full-text catalogs on separate disks. Installieren Sie schnellere Datenträger, und verwenden Sie RAID, um die Indexleistung zu verbessern.Installing faster disks and using RAID can also help improve indexing performance.

    Hinweis

    Ab SQL Server 2008SQL Server 2008 kann die Volltext-Engine den AWE-Speicher verwenden, weil die Volltext-Engine Teil von sqlservr.exe ist.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.

Volltext-Batchverarbeitungs ProblemeFull-text batching issues

Wenn auf dem System keine Hardwareengpässe vorhanden sind, hängt die Indizierungsleistung der Volltextsuche vor allem von folgenden Faktoren ab:If the system has no hardware bottlenecks, the indexing performance of full-text search mostly depends on the following:

  • Wie lange das Erstellen von Volltextbatches durch SQL ServerSQL Server dauert.How long it takes SQL ServerSQL Server to create full-text batches.

  • Wie schnell der Filterdaemon diese Batches verarbeiten kann.How quickly the filter daemon can consume those batches.

Volltextindex-AuffüllungsproblemeFull-text index population issues

  • Typ der Auffüllung.Type of population. Im Gegensatz zur vollständigen Auffüllung eignet sich die inkrementelle, manuelle und automatische Änderungsnachverfolgung der Auffüllung nicht zum Maximieren von Hardwareressourcen, um schnellere Geschwindigkeiten zu erzielen.Unlike full population, incremental, manual, and auto change tracking population are not designed to maximize hardware resources to achieve faster speed. Aus diesem Grund können die Optimierungsvorschläge in diesem Thema die Leistung für Volltextindizierung nicht verbessern, wenn sie inkrementelle, manuelle oder automatische Änderungsüberwachungsauffüllung verwenden.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.

  • MastermergeMaster merge. Nach dem Ende einer Auffüllung wird ein abschließender Mergeprozess ausgelöst, der die Indexfragmente zu einem Mastervolltextindex zusammenführt.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Dies ermöglicht eine verbesserte Abfrageleistung, da statt mehrerer Indexfragmente nur der Masterindex abgefragt werden muss. Zudem können bessere Bewertungsstatistiken zum Erstellen der Relevanzrangfolge verwendet werden.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. Der Mastermergeprozess kann E/A-intensiv sein, da beim Zusammenführen der Indexfragmente umfangreiche Daten geschrieben und gelesen werden müssen. Eingehende Abfragen werden dadurch jedoch nicht blockiert.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.

    Die Masterzusammenführung einer großen Datenmenge kann eine Transaktion mit langer Ausführungszeit erzeugen und das Abschneiden des Transaktionsprotokolls während des Prüfpunkts verzögern.Master merging a large amount of data can create a long running transaction, delaying truncation of the transaction log during checkpoint. In diesem Fall kann das Transaktionsprotokoll unter dem vollständigen Wiederherstellungsmodell erheblich anwachsen.In this case, under the full recovery model, the transaction log might grow significantly. Sie sollten sicherstellen, dass das Transaktionsprotokoll vor dem Reorganisieren eines großen Volltextindexes in einer Datenbank, die das vollständige Wiederherstellungsmodell verwendet, genügend Speicherplatz für eine Transaktion mit langer Laufzeit bietet.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. Weitere Informationen finden Sie unter Verwalten der Größe der Transaktionsprotokolldatei.For more information, see Manage the Size of the Transaction Log File.

Optimieren der Leistung von VolltextindizesTune the performance of full-text indexes

Sie können die Leistung Ihrer Volltextindizes mit den folgenden bewährten Methoden maximieren:To maximize the performance of your full-text indexes, implement the following best practices:

  • Um alle Prozessoren oder Kerne maximal zu nutzen, setzen Sie sp_configure 'max full-text crawl ranges' auf die Anzahl der CPUs des Systems fest.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. Informationen zu dieser Konfigurationsoption finden Sie unter Max. Bereich für Volltextdurchforstung (Serverkonfigurationsoption).For information about this configuration option, see max full-text crawl range Server Configuration Option.

  • Stellen Sie sicher, dass die Basistabelle einen gruppierten Index besitzt.Make sure that the base table has a clustered index. Verwenden Sie einen ganzzahligen Datentyp für die erste Spalte des gruppierten Index.Use an integer data type for the first column of the clustered index. Vermeiden Sie das Verwenden von GUIDs in der ersten Spalte des gruppierten Index.Avoid using GUIDs in the first column of the clustered index. Eine Mehrbereichsauffüllung für einen gruppierten Index kann die höchste Auffüllungsgeschwindigkeit erzielen.A multi-range population on a clustered index can produce the highest population speed. Es ist ratsam, für die Spalte, die als Volltextschlüssel dient, einen ganzzahligen Datentyp zu verwenden.We recommend that the column serving as the full-text key be an integer data type.

  • Aktualisieren Sie die Statistiken der Basistabelle mithilfe der UPDATE STATISTICS -Anweisung.Update the statistics of the base table by using the UPDATE STATISTICS statement. Noch wichtiger ist das Aktualisieren der Statistik für den gruppierten Index bzw. des Volltextschlüssels für eine vollständige Auffüllung.More important, update the statistics on the clustered index or the full-text key for a full population. Dies unterstützt eine Mehrbereichsauffüllung beim Erzeugen guter Partitionen in der Tabelle.This helps a multi-range population to generate good partitions on the table.

  • Bevor Sie eine vollständige Auffüllung auf einem großen Computer mit mehreren CPUs ausführen, sollten Sie die Größe des Pufferpools vorübergehend einschränken, indem Sie den max server memory -Wert so festlegen, dass noch genug Speicher für den fdhost.exe-Prozess und die Betriebssystemprozesse verfügbar ist.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. Weitere Informationen finden Sie unter "Schätzen der Arbeitsspeicheranforderungen des Filterdaemon-Hostprozesses (fdhost.exe)" weiter unten in diesem Thema.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic.

  • Wenn Sie eine inkrementelle Auffüllung basierend auf einer timestamp-Spalte verwenden, erstellen Sie einen zweiten Index in einer timestamp-Spalte, wenn Sie die Leistung der inkrementellen Auffüllung verbessern möchten.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.

Beheben von Leistungsproblemen bei vollständiger AuffüllungTroubleshoot the performance of full populations

Überprüfen Sie die VolltextdurchforstungsprotokolleReview the full-text crawl logs

Leistungsprobleme diagnostizieren Sie, indem Sie die Volltextdurchforstungsprotokolle überprüfen.To help diagnose performance problems, look at the full-text crawl logs.

Tritt während eines Durchforstungsvorgangs ein Fehler auf, wird von der Durchforstungsprotokollfunktion der Volltextsuche ein Durchforstungsprotokoll erstellt und gewartet. Dabei handelt es sich um eine Nur-Text-Datei.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. Jedes Durchforstungsprotokoll gehört zu einem bestimmten Volltextkatalog.Each crawl log corresponds to a particular full-text catalog. Standardmäßig befinden sich Durchforstungsprotokolle für eine bestimmte Instanz (in diesem Beispiel die Standardinstanz) im Ordner %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.

Das Benennungsschema für Durchforstungsprotokolldateien lautet folgendermaßen:The crawl log file follows the following naming scheme:

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

Die variablen Teile des Durchforstungsprotokolldatei-Namens sind die folgenden.The variable parts of the crawl log file name are the following.

  • <DatabaseID>: Die ID einer Datenbank.<DatabaseID> - The ID of a database. <dbid> ist eine fünfstellige Zahl mit führenden Nullen. <dbid> is a five digit number with leading zeros.
  • <Volltext-Katalog-ID>: Die ID eines Volltextkatalogs.<FullTextCatalogID> - Full-text catalog ID. <catid> ist eine fünfstellige Zahl mit führenden Nullen.<catid> is a five digit number with leading zeros.
  • <n>: Ist eine ganze Zahl, die angibt, dass mindestens ein Durchforstungsprotokoll desselben Volltextkatalogs vorhanden ist.<n> - Is an integer that indicates one or more crawl logs of the same full-text catalog exist.

SQLFT0000500008.2 ist z.B. die Durchforstungsprotokolldatei für eine Datenbank mit der Datenbank-ID = 5 und der Volltextkatalog-ID = 8.For example, SQLFT0000500008.2 is the crawl log file for a database with database ID = 5, and full-text catalog ID = 8. Die 2 am Ende des Dateinamens gibt an, dass zwei Durchforstungsprotokolldateien für dieses Datenbank-Katalog-Paar vorhanden sind.The 2 at the end of the file name indicates that there are two crawl log files for this database/catalog pair.

Überprüfen Sie die Verwendung des physischen SpeichersCheck physical memory usage

Während einer Volltextauffüllung ist es möglich, dass fdhost.exe oder sqlservr.exe viel Arbeitsspeicher beansprucht oder nicht genügend Arbeitsspeicher vorhanden ist.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.

  • Wenn das Protokoll der Volltextdurchforstung zeigt, dass fdhost.exe häufig neu gestartet oder dass Fehlercode 8007008 zurückgegeben wird, bedeutet dies, dass für einen der Prozesse kein Speicher mehr verfügbar ist.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.
  • Wenn fdhost.exe Dumps erzeugt, insbesondere auf großen Multi-CPU-Computern, steht möglicherweise nicht genügend Arbeitsspeicher zur Verfügung.If fdhost.exe is producing dumps, particularly on large, multi-CPU computers, it might be running out of memory.
  • Informationen zu Arbeitsspeicherpuffern, die von einer Volltextdurchforstung verwendet werden, finden Sie unter 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).

Die möglichen Ursachen für geringen Speicherplatz oder Problemen mit nicht genügend Arbeitsspeicher sind folgende:The possible causes of low memory or out of memory issues are the following:

  • Der Arbeitsspeicher reicht nicht aus.Insufficient memory. Wenn der physische Speicher, der während einer vollständigen Auffüllung verfügbar ist, 0 ist, kann es sein, dass der SQL ServerSQL Server-Pufferpool den größten Teil des physischen Speichers des Systems belegt.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.

    Der Prozess "sqlservr.exe" versucht, den gesamten verfügbaren Speicher für den Pufferpool bis zum konfigurierten maximalen Serverarbeitsspeicher für sich zu beanspruchen.The sqlservr.exe process tries to grab all available memory for the buffer pool, up to the configured maximum server memory. Wenn die max server memory -Zuordnung zu groß ist, können Probleme aufgrund ungenügenden Arbeitsspeichers und Fehler bei der Zuordnung von gemeinsam genutzten Speicherbereich für den Prozess „fdhost.exe“ auftreten.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.

    Sie können dieses Problem beheben, indem Sie den Wert max server memory des SQL ServerSQL Server -Pufferpools entsprechend anpassen.You can solve this problem by setting the max server memory value of the SQL ServerSQL Server buffer pool appropriately. Weitere Informationen finden Sie unter "Schätzen der Arbeitsspeicheranforderungen des Filterdaemon-Hostprozesses (fdhost.exe)" weiter unten in diesem Thema.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic. Möglicherweise ist es auch hilfreich, die verwendete Batchgröße für die Volltextindizierung zu reduzieren.Reducing the batch size used for full-text indexing may also help.

  • Speicherkonflikte.Memory contention. Während einer Volltextauffüllung können auf Multi-CPU-Computern Konflikte zwischen fdhost.exe oder sqlservr.exe um den Pufferpoolarbeitsspeicher auftreten.During a full-text population on a multi-CPU computer, contention for the buffer pool memory can occur between fdhost.exe or sqlservr.exe. Der daraus resultierende Mangel an gemeinsam genutztem Speicherbereich verursacht Batchwiederholungen, Arbeitsspeicherüberlastung und Dumps durch den Prozess "fdhost.exe".The resulting lack of shared memory causes batch retries, memory thrashing, and dumps by the fdhost.exe process.

  • AuslagerungsproblemePaging issues. Eine zu kleine Auslagerungsdatei, z. B. wenn ein System über eine kleine Auslagerungsdatei mit eingeschränkter Vergrößerung verfügt, kann ebenfalls dazu führen, dass fdhost.exe oder sqlservr.exe nicht mehr auf genügend Arbeitsspeicher zugreifen können.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. Wenn die Crawlprotokolle keine speicherbezogenen Fehler anzeigen, ist die Leistung wahrscheinlich aufgrund zu vieler Auslagerungen beeinträchtigt.If the crawl logs do not indicate any memory-related failures, it is likely that performance is slow due to excessive paging.

Schätzen der Arbeitsspeicheranforderungen des Filterdaemon-Hostprozesses (fdhost.exe)Estimate the memory requirements of the Filter Daemon Host process (fdhost.exe)

Der vom fdhost.exe-Prozess für eine Auffüllung benötigte Arbeitsspeicher hängt hauptsächlich von den verwendeten Volltext-Crawlbereichen, der Größe des Inbound Shared Memory (ISM) und der maximalen Anzahl von ISM-Instanzen ab.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.

Der vom Filterdaemonhost verwendete Arbeitsspeicher (in Bytes) kann mit der folgenden Formel ungefähr geschätzt werden: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

Die Standardwerte der Variablen in der vorangehenden Formel lauten wie folgt:The default values of the variables in the preceding formula are as follows:

VariableVariable StandardwertDefault value
number_of_crawl_rangesnumber_of_crawl_ranges Die Anzahl der CPUsThe number of CPUs
ism_sizeism_size 1 MB für x86-Computer1 MB for x86 computers

4 MB, 8 MB oder 16 MB für x64-Computer, abhängig vom gesamten physischen Arbeitsspeicher4 MB, 8 MB, or 16MB for x64 computers, depending on the total physical memory
max_outstanding_ismsmax_outstanding_isms 25 für x86-Computer25 for x86 computers

5 für x64-Computer5 for x64 computers

Die folgende Tabelle enthält Richtlinien zum Schätzen der Arbeitsspeicheranforderungen von fdhost.exe.The following table presents guidelines about how to estimate the memory requirements of fdhost.exe. Die Formeln in dieser Tabelle verwenden die folgenden Werte:The formulas in this table use the following values:

  • F, eine Schätzung des Arbeitsspeichers, den „fdhost.exe“ (in MB) benötigt.F, which is an estimate of memory needed by fdhost.exe (in MB).

  • T, der gesamte physische Speicher, der für das System (in MB) verfügbar ist.T, which is the total physical memory available on the system (in MB).

  • M, die optimale max server memory -Einstellung.M, which is the optimal max server memory setting.

Wichtige Informationen zu den folgenden Formeln finden Sie in den Notizen unter der Tabelle.For essential information about the following formulas, see the notes that follow the table.

PlatformPlatform Schätzung des von „fdhost.exe“ benötigten Arbeitsspeichers in MB: F^1Estimating fdhost.exe memory requirements in MB-F^1 Formel zum Berechnen des „max server memory“-Werts: M^2Formula for calculating max server memory-M^2
x86x86 F = Anzahl der Durchforstungsbereiche * 50F = Number of crawl ranges * 50 M = Minimum (T, 2000) - F - 500M =minimum(T, 2000) - F - 500
x64x64 F = Anzahl der Durchforstungsbereiche * 10 * 8F = Number of crawl ranges * 10 * 8 M = T - F - 500M = T - F - 500

Hinweise zu den FormelnNotes about the formulas

  1. Wenn mehrere vollständige Auffüllungen ausgeführt werden, berechnen Sie die Arbeitsspeicheranforderungen für „fdhost.exe“ separat, also F1, F2, usw.If multiple full populations are in progress, calculate the fdhost.exe memory requirements of each separately, as F1, F2, and so forth. Berechnen Sie anschließend M als T - sigma ( _F_i ) .Then calculate M as T- sigma (_F_i ).
  2. 500 MB ist eine Schätzung des erforderlichen Speichers, der von den anderen Prozessen im System benötigt wird.500 MB is an estimate of the memory required by other processes in the system. Wenn das System noch weitere Aufgaben durchführt, sollten Sie diesen Wert entsprechend erhöhen.If the system is doing additional work, increase this value accordingly.
  3. .ism_size wird 8 MB für x64-Plattformen angenommen..ism_size is assumed to be 8 MB for x64 platforms.

Beispiel: Schätzen der Arbeitsspeicheranforderungen von fdhost.exeExample: Estimate the memory requirements of fdhost.exe

Dieses Beispiel gilt für einen 64-Bit-Computer mit 8 GM RAM und 4 dual-Core-Prozessoren.This example is for an 64-bit computer that has 8GM of RAM and 4 dual core processors. Die erste Berechnung schätzt den Speicher, der von „fdhost.exe“ benötigt wird: F.The first calculation estimates of memory needed by fdhost.exe-F. Die Anzahl der Durchforstungsbereiche beträgt 8.The number of crawl ranges is 8.

F = 8*10*8=640

Die nächste Berechnung ergibt den optimalen Wert für max server memory-M.The next calculation obtains the optimal value for max server memory-M. T, der gesamte physische Speicher, der auf diesem System verfügbar ist, beträgt 8192 (in MB).The total physical memory available on this system in MB-T-is 8192.

M = 8192-640-500=7052

Beispiel: Festlegen des maximalen ServerarbeitsspeichersExample: Setting max server memory

In diesem Beispiel werden die Anweisungen sp_configure und RECONFIGURE von Transact-SQLTransact-SQL verwendet, um maximalen Serverarbeitsspeicher auf den Wert festzulegen, der im vorherigen Beispiel für M berechnet wurde, also 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  

Weitere Informationen zur Serverarbeitsspeicher-Option finden Sie unter Serverkonfigurationsoptionen für den Serverarbeitsspeicher.For more info about the server memory options, see Server Memory Server Configuration Options.

Überprüfen der CPU-VerwendungCheck CPU usage

Es ist wahrscheinlich, dass die Leistung der vollständigen Auffüllungen nicht optimal ist, wenn der mittlere CPU-Verbrauch weniger als 30 Prozent beträgt.The performance of full populations is not optimal when the average CPU consumption is lower than about 30 percent. In diesem Abschnitt werden einige Faktoren behandelt, die sich auf den CPU-Verbrauch auswirken.Here are some factors that affect CPU consumption.

  • Lange Wartezeiten für SeitenHigh wait time for pages

    Um herauszufinden, ob die Wartezeit für Seiten hoch ist, führen Sie die folgende Transact-SQLTransact-SQL-Anweisung aus:To find out whether a page wait time is high, run the following Transact-SQLTransact-SQL statement:

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

    In der folgenden Tabelle sind die relevanten Wartetypen aufgeführt.The following table describes the wait types of interest here.

    WartetypWait type und BeschreibungDescription Mögliche LösungPossible resolution
    PAGEIO_LATCH_SH (_EX oder _UP)PAGEIO_LATCH_SH (_EX or _UP) Dies kann auf einen E/A-Engpass hinweisen. In diesem Fall ist normalerweise auch eine hohe durchschnittliche Warteschlangenlänge des Datenträgers zu erkennen.This could indicate an IO bottleneck, in which case you would typically also see a high average disk-queue length. Sie können den E/A-Engpass ggf. reduzieren, indem Sie den Volltextindex in eine andere Dateigruppe auf einem anderen Datenträger verschieben.Moving the full-text index to a different filegroup on a different disk could help reduce the IO bottleneck.
    PAGELATCH_EX (oder _UP)PAGELATCH_EX (or _UP) Dies kann auf eine hohe Zahl von Konflikten zwischen Threads hinweisen, die versuchen, in dieselbe Datenbankdatei zu schreiben.This could indicate a lot of contention among threads that are trying to write to the same database file. Diese Konflikte können ggf. verringert werden, indem Sie Dateien der Dateigruppe hinzufügen, auf der sich der Volltextindex befindet.Adding files to the filegroup on which the fulltext index resides could help alleviate such contention.

    Weitere Informationen finden Sie unter sys.dm_os_wait_stats (Transact-SQL).For more info, see sys.dm_os_wait_stats (Transact-SQL).

  • Ineffizienzen beim Durchsuchen der BasistabelleInefficiencies in scanning the base table

    Eine vollständige Auffüllung durchsucht die Basistabelle, um Batches zu erzeugen.A full population scans the base table to produce batches. Dieses Durchsuchen der Tabelle kann in den folgenden Szenarios ineffizient sein:This table scanning could be inefficient in the following scenarios:

    • Wenn die Basistabelle über einen hohen Prozentsatz an Außerhalb-Spalten (out-of-row) verfügt, für die eine Volltextindizierung durchgeführt wird, kann das Durchsuchen der Basistabelle zum Erzeugen von Batches den Engpass bewirken.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 diesem Fall kann es helfen, die kleineren Daten mithilfe von varchar(max) oder nvarchar(max) in die Zeilen zu verschieben.In this case, moving the smaller data in-row using varchar(max) or nvarchar(max) might help.

    • Wenn die Basistabelle stark fragmentiert ist, kann das Durchsuchen ggf. ineffizient sein.If the base table is very fragmented, scanning might be inefficient. Informationen zur Berechnung von Außerhalb-Spalten-Daten und zur Indexfragmentierung finden Sie unter sys.dm_db_partition_stats (Transact-SQL) und 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).

      Um die Fragmentierung zu reduzieren, können Sie den gruppierten Index neu organisieren oder neu erstellen.To reduce fragmentation, you can reorganize or rebuild the clustered index. Weitere Informationen finden Sie unter Neuorganisieren und Neuerstellen von Indizes.For more information, see Reorganize and Rebuild Indexes.

Problembehandlung bei langsamer Indizierung von DokumentenTroubleshoot slow indexing of documents

Hinweis

Dieser Abschnitt beschreibt ein Problem, das nur Kunden betrifft, die Dokumente indizieren (z.B. Microsoft Word-Dokumente), in die andere Dokumenttypen eingebettet sind.This section describes an issue that only affects customers who index documents (such as Microsoft Word documents) in which other document types are embedded.

Beim Auffüllen eines Volltextindexes werden von der Volltext-Engine zwei Arten von Filtern verwendet, Multithread-Filter und Filter mit einem einzigen Thread.The Full-Text Engine uses two types of filters when it populates a full-text index: multithreaded filters and single-threaded filters.

  • Einige Dokumente, wie z. B. MicrosoftMicrosoft Word-Dokumente, werden mit einem Multithreadfilter gefiltert.Some documents, such as MicrosoftMicrosoft Word documents, are filtered using a multithreaded filter.
  • Andere Dokumente, wie z. B. Adobe Acrobat PDF-Dokumente (Portable Document Format), werden hingegen mit einem Filter mit einem einzigen Thread gefiltert.Other documents, such as Adobe Acrobat Portable Document Format (PDF) documents, are filtered using a single-threaded filter.

Aus Sicherheitsgründen werden Filter mit Filterdaemon-Hostprozessen geladen.For security reasons, filters are loaded by the filter daemon host processes. Eine Serverinstanz verwendet einen Multithreadprozess für alle Multithreadfilter und einen Singlethreadprozess für alle Filter mit einem einzigen Thread.A server instance uses a multithreaded process for all multithreaded filters and a single-threaded process for all single-threaded filters. Wenn in einem Dokument, für das ein Multithreadfilter verwendet wird, ein Dokument eingebettet ist, für das ein Filter mit einem einzigen Thread verwendet wird, startet die Volltext-Engine einen Singlethreadprozess für das eingebettete Dokument.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. Beispiel: Bei einem Word-Dokument, das ein PDF-Dokument enthält, verwendet die Volltext-Engine einen Multithreadprozess für den Inhalt des Word-Dokuments und einen Singlethreadprozess für den Inhalt des PDF-Dokuments.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. Ein Filter mit einem einzigen Thread funktioniert in dieser Umgebung jedoch möglicherweise nicht ordnungsgemäß und kann die Stabilität des Filterprozesses gefährden.A single-threaded filter might not work well in this environment, however, and could destabilize the filtering process. Unter bestimmten Umständen mit vielen eingebetteten Dokumenten, kann Destabilisierung zum Absturz des Prozesses führen.In certain circumstances where such embedding is common, destabilization might lead to crashes of the process. In diesem Fall verbindet die Volltext-Engine alle Dokumente, bei denen Fehler auftraten (z.B. ein Word-Dokument mit eingebettetem PDF-Inhalt), erneut mit dem Singlethread-Filterprozess.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. Kommt dies häufig vor, hat das eine Leistungsminderung des Volltextindizierungsprozesses zur Folge.If re-routing occurs frequently, it results in performance degradation of the full-text indexing process.

Sie müssen den Filter für das Containerdokument (hier das Word-Dokument) als Filter mit einem einzigen Thread kennzeichnen, um dieses Problem zu umgehen.To work around this problem, mark the filter for the container document (the Word document, in this example) as a single-threaded filter. Hierzu müssen Sie den Registrierungswert ThreadingModel für den Filter auf Apartment Threaded festlegen.To mark a filter as a single-threaded filter, set the ThreadingModel registry value for the filter to Apartment Threaded. Informationen zu Singlethreadapartments finden Sie im Whitepaper Understanding and Using COM Threading Models(Grundlegendes zur Verwendung von COM-Threadingmodellen).For information about single-threaded apartments, see the white paper Understanding and Using COM Threading Models.

Weitere InformationenSee Also

Serverkonfigurationsoptionen für den Serverarbeitsspeicher Server Memory Server Configuration Options
Max. Bereich für Volltextdurchforstung (Serverkonfigurationsoption) max full-text crawl range Server Configuration Option
Auffüllen von Volltextindizes Populate Full-Text Indexes
Erstellen und Verwalten von Volltextindizes 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)
Behandeln von Problemen mit der VolltextindizierungTroubleshoot Full-Text Indexing