Leistungssteigerung und Optimierung von Volltextindizes

Die Leistung für Volltextindizes und Volltextabfragen wird von den Hardwareressourcen wie Arbeitsspeicher, Datenträgergeschwindigkeit, CPU-Geschwindigkeit und Computerarchitektur beeinflusst. Der Hauptgrund für das Reduzieren der Leistung von Volltextindizes sind Einschränkungen bei den Hardwareressourcen:

  • Wenn die CPU-Nutzung des Filterdaemon-Hostprozesses (fdhost.exe) oder des SQL Server-Prozesses (sqlservr.exe) fast 100 % beträgt, dann ist die CPU der Engpass.

  • 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. Die erste Problemumgehung ist das Erstellen von Volltextkatalogen, die getrennt von den SQL Server-Datenbankendateien und -protokollen sind. Platzieren Sie Protokolle, die Datenbankdateien und Volltextkataloge auf getrennten Datenträgern. Kaufen Sie schnellere Datenträger, und verwenden Sie RAID, um die Indexleistung zu verbessern.

  • Wenn ein Mangel an physikalischem Speicher (3-GB-Grenze) besteht, kann ggf. der Arbeitsspeicher der Engpass sein. Einschränkungen des physilalischen Arbeitsspeichers sind auf allen Systemen möglich, und auf 32-Bit-Systemen kann knapper virtueller Arbeitsspeicher die Volltextindizierung verlangsamen.

    HinweisHinweis

    Ab SQL Server 2008 kann das Volltextmodul den AWE-Speicher verwenden, weil das Volltextmodul Teil von sqlservr.exe ist.

Wenn auf dem System keine Hardwareengpässe vorhanden sind, hängt die Indizierungsleistung der Volltextsuche vor allem von folgenden Faktoren ab:

  • Wie lange das Erstellen von Volltextbatches durch SQL Server dauert.

  • Wie schnell der Filterdaemon diese Batches verarbeiten kann.

HinweisHinweis

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. Deshalb können diese Optimierungsvorschläge nicht die Leistung für Volltextindizes verbessern.

Nach dem Ende einer Auffüllung wird ein abschließender Mergeprozess ausgelöst, der die Indexfragmente zu einem Mastervolltextindex zusammenführt. 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. Beachten Sie, dass die Masterzusammenführung E/A-intensiv sein kann, da beim Zusammenführen der Indexfragmente umfangreiche Datenmengen geschrieben und gelesen werden müssen. Eingehende Abfragen werden dadurch jedoch nicht blockiert.

Wichtiger HinweisWichtig

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. In diesem Fall kann das Transaktionsprotokoll unter dem vollständigen Wiederherstellungsmodell erheblich anwachsen. 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. Weitere Informationen finden Sie unter Verwalten der Größe der Transaktionsprotokolldatei.

Optimieren der Leistung von Volltextindizes

Um die Leistung der Volltextindizes zu maximieren, implementieren Sie die folgenden bewährten Methoden:

  • Um alle Prozessoren oder Kerne maximal zu nutzen, setzen Sie sp_configure 'max full-text crawl ranges' auf die Anzahl der CPUs des Systems. Weitere Informationen zu dieser Konfigurationsoption finden Sie unter max full-text crawl range (Option).

  • Stellen Sie sicher, dass die Basistabelle einen gruppierten Index besitzt. Verwenden Sie einen ganzzahligen Datentyp für die erste Spalte des gruppierten Index. Vermeiden Sie das Verwenden von GUIDs in der ersten Spalte des gruppierten Index. Eine Mehrbereichsauffüllung für einen gruppierten Index kann die höchste Auffüllungsgeschwindigkeit erzielen. Es ist ratsam, für die Spalte, die als Volltextschlüssel dient, einen ganzzahligen Datentyp zu verwenden.

  • Aktualisieren Sie die Statistiken der Basistabelle mithilfe der UPDATE STATISTICS-Anweisung. Noch wichtiger ist das Aktualisieren der Statistik für den gruppierten Index bzw. des Volltextschlüssels für eine vollständige Auffüllung. Dies unterstützt eine Mehrbereichsauffüllung beim Erzeugen guter Partitionen in der Tabelle.

  • Erstellen Sie einen zweiten Index in einer timestamp-Spalte, wenn Sie die Leistung der inkrementellen Auffüllung verbessern möchten.

  • Bevor Sie eine vollständige Auffüllung auf einem großen Multi-CPU-Computer 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. Weitere Informationen finden Sie in "Schätzen der Arbeitsspeicheranforderungen des Filterdaemon-Hostprozesses (fdhost.exe)" weiter unten in diesem Thema.

Beheben von Leistungsproblemen bei vollständigen Auffüllungen

Um Leistungsprobleme zu diagnostizieren, überprüfen Sie die Protokolle für den Volltextcrawl. Weitere Informationen zu Crawlprotokollen finden Sie unter Beheben von Fehlern in einer Volltextauffüllung (Durchforstung).

Es ist ratsam, bei der Problembehandlung die folgende Reihenfolge einzuhalten, falls die Leistung der vollständigen Auffüllungen nicht zufriedenstellend ist.

Verwendung des physikalischen Speichers

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. 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. Wenn fdhost.exe Dumps erzeugt, insbesondere auf großen Multi-CPU-Computern, steht möglicherweise nicht genügend Arbeitsspeicher zur Verfügung.

HinweisHinweis

Informationen zu von einem Volltextcrawl verwendeten Arbeitsspeicherpuffer finden Sie unter sys.dm_fts_memory_buffers (Transact-SQL).

Die folgenden Ursachen sind möglich:

  • Wenn der physikalische Speicher, der während einer vollständigen Auffüllung verfügbar ist, 0 (null) ist, kann es sein, dass der SQL Server-Pufferpool den größten Teil des physikalischen Speichers des Systems belegt.

    Der sqlservr.exe-Prozess versucht, den gesamten verfügbaren Speicher für den Pufferpool bis zum konfigurierten maximalen Serverarbeitsspeicher für sich zu beanspruchen. 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 fdhost.exe-Prozess auftreten.

    HinweisHinweis

    Während einer Volltextauffüllung können auf Multi-CPU-Computern, z. B. 64-Wege IA64-Computer, Konflikte zwischen fdhost.exe oder sqlservr.exe um den Pufferpoolarbeitsspeicher auftreten. Der daraus resultierende Mangel an gemeinsam genutztem Speicherbereich verursacht Batchwiederholungen, Arbeitsspeicherüberlastung und Dumps durch den fdhost.exe-Prozess.

    Sie können dieses Problem beheben, indem Sie den Wert max server memory des SQL Server-Pufferpools entsprechend anpassen. Weitere Informationen finden Sie im Abschnitt "Schätzen der Arbeitsspeicheranforderungen des Filterdaemon-Hostprozesses (fdhost.exe)" weiter unten in diesem Thema. Möglicherweise ist es auch hilfreich, die verwendete Batchgröße für die Volltextindizierung zu reduzieren.

  • Ein Auslagerungsproblem

    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.

    Wenn die Crawlprotokolle keine speicherbezogenen Fehler anzeigen, ist die Leistung wahrscheinlich aufgrund zu vieler Auslagerungen geringer.

Schätzen der Arbeitsspeicheranforderungen des Filterdaemon-Hostprozesses (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.

Der vom Filterdaemonhost verwendete Arbeitsspeicher (in Bytes) kann mit der folgenden Formel ungefähr geschätzt werden:

number_of_crawl_ranges * ism_size * max_outstanding_isms * 2

Die Standardwerte der Variablen in der vorangehenden Formel lauten wie folgt:

Variable

Standardwert

number_of_crawl_ranges

Die Anzahl der CPUs

ism_size

1 MB für x86-Computer

4 MB, 8 MB oder 16 MB für x64-Computer, abhängig vom gesamten physikalischen Arbeitsspeicher

max_outstanding_isms

25 für x86-Computer

5 für x64-Computer

Die folgende Tabelle enthält Richtlinien zum Schätzen der Arbeitsspeicheranforderungen von fdhost.exe. Die Formeln in dieser Tabelle verwenden die folgenden Werte:

  • F, eine Schätzung des Arbeitsspeichers, der von fdhost.exe (in MB) benötigt wird.

  • T, der gesamte physikalische Speicher, der für das System (in MB) verfügbar ist.

  • M, die optimale Einstellung von max server memory.

Wichtiger HinweisWichtig

Grundlegende Informationen zu den Formeln finden Sie unten unter 1, 2 und 3.

Plattform

Schätzung des benötigten Arbeitsspeichers von "fdhost.exe" in MB: F1

Formel zum Berechnen des max server memory-Werts: M2

x86 mit deaktivierten AWE

F=Number of crawl ranges* 50

M=minimum(T, 2000)–F 500

x86 mit aktivierten AWE

F=Number of crawl ranges* 50

M=TF 500

x64 oder IA643

F=Number of crawl ranges* 10 * 8

M=TF 500

1 Wenn mehrere vollständige Auffüllungen ausgeführt werden, berechnen Sie die Arbeitsspeicheranforderungen für fdhost.exe separat, also F1, F2 usw. Berechnen Sie dann M als T**–** sigma**(Fi)**.

2 500 MB ist eine Schätzung des erforderlichen Speichers, der von den anderen Prozessen im System benötigt wird. Wenn das System noch weitere Aufgaben durchführt, sollten Sie diesen Wert entsprechend erhöhen.

3 .ism_size wird als 8 MB für x64-Plattformen angenommen.

Beispiel: Schätzen der Arbeitsspeicheranforderungen von "fdhost.exe"

Dieses Beispiel gilt für einen AMD64-Computer mit 8 GB Arbeitsspeicher und 4 Dual Core-Prozessoren. Die erste Berechnung schätzt den Speicher, der von fdhost.exe benötigt wird: F. Die Anzahl der Durchforstungsbereiche beträgt 8.

F = 8*10*8=640

Die nächste Berechnung ermittelt den optimalen Wert für max server memory: M. Der gesamte physikalische Speicher in MB, der auf diesem System verfügbar ist – T –, beträgt 8192.

M = 8192-640-500=7052

Beispiel: Festlegen von max server memory

In diesem Beispiel werden die sp_configure-Anweisung und die RECONFIGURE-Transact-SQL-Anweisung verwendet, um max server memory auf den Wert festzulegen, der im vorherigen Beispiel für M berechnet wurde, also 7052:

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

So legen Sie die Konfigurationsoption "max server memory" fest

Faktoren, die den CPU-Verbrauch reduzieren können

Es ist wahrscheinlich, dass die Leistung von vollständigen Auffüllungen nicht optimal ist, wenn der mittlere CPU-Verbrauch weniger als 30 Prozent beträgt. In diesem Abschnitt werden einige Faktoren behandelt, die sich auf den CPU-Verbrauch auswirken.

  • Langes Warten auf Seiten

    Um herauszufinden, ob die Wartezeit für Seiten hoch ist, führen Sie die folgende Transact-SQL-Anweisung aus:

    Execute 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.

    Wartetyp

    Beschreibung

    Mögliche Lösung

    PAGEIO_LATCH_SH (_EX oder _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.

    Sie können den E/A-Engpass ggf. reduzieren, indem Sie den Volltextindex in eine andere Dateigruppe auf einem anderen Datenträger verschieben.

    PAGELATCH_EX (oder _UP)

    Dies kann auf eine hohe Zahl von Konflikten zwischen Threads hinweisen, die versuchen, in dieselbe Datenbankdatei zu schreiben.

    Diese Konflikte können ggf. verringert werden, indem Sie Dateien der Dateigruppe hinzufügen, auf der sich der Volltextindex befindet.

    Weitere Informationen finden Sie unter sys.dm_os_wait_stats (Transact-SQL).

  • Ineffizienzen beim Durchsuchen der Basistabelle

    Eine vollständige Auffüllung durchsucht die Basistabelle, um Batches zu erzeugen. Dieses Durchsuchen der Tabelle kann in den folgenden Szenarios ineffizient sein:

    • 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. In diesem Fall kann es helfen, die kleineren Daten mithilfe von varchar(max) oder nvarchar(max) in die Zeilen zu verschieben.

    • Wenn die Basistabelle stark fragmentiert ist, kann das Durchsuchen ggf. ineffizient sein. Informationen zur Berechnung von Daten, die außerhalb von Zeilen vorliegen, und zur Indexfragmentierung finden Sie unter sys.dm_db_partition_stats (Transact-SQL) und sys.dm_db_index_physical_stats (Transact-SQL).

      Um die Fragmentierung zu reduzieren, können Sie den gruppierten Index neu organisieren oder neu erstellen. Weitere Informationen finden Sie unter Neuorganisieren und Neuerstellen von Indizes.