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 physischem Speicher (3-GB-Grenze) besteht, kann ggf. der Arbeitsspeicher der Engpass sein. Einschränkungen des physischen Arbeitsspeichers sind auf allen Systemen möglich, und auf 32-Bit-Systemen kann knapper virtueller Arbeitsspeicher die Volltextindizierung verlangsamen.
Hinweis 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.
Hinweis |
---|
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.
Wichtig |
---|
Die Masterzusammenführung einer großen Datenmenge kann eine Transaktion mit langer Ausführungszeit verursachen 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 (Crawl).
Wenn die Leistung der vollständigen Auffüllungen nicht zufriedenstellend ist, empfiehlt es sich, bei der Problembehandlung die folgende Reihenfolge einzuhalten.
Verwendung des physischen 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 laut Protokoll des Volltextcrawls fdhost.exe häufig gestartet wird oder 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.
Hinweis |
---|
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 physische Speicher, der während einer vollständigen Auffüllung verfügbar ist, null ist, beansprucht der SQL Server-Pufferpool möglicherweise den größten Teil des physischen Systemspeichers.
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.
Hinweis 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 max server memory-Wert 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 physischen 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 physische Speicher, der für das System (in MB) verfügbar ist.
M, die optimale Einstellung von max server memory.
Wichtig |
---|
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=T–F– 500 |
x64 oder IA643 |
F=Number of crawl ranges* 10 * 8 |
M=T–F– 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 Prozesse ausführt, sollten Sie diesen Wert entsprechend erhöhen.
3 Für ism_size wird 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 Crawlbereiche beträgt 8.
F = 8*10*8=640
Die nächste Berechnung ermittelt den optimalen Wert für max server memory: M. Der gesamte physische 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 Transact-SQL-Anweisungen sp_configure und RECONFIGURE 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-Auslastung reduzieren können
Es ist wahrscheinlich, dass die Leistung von vollständigen Auffüllungen nicht optimal ist, wenn die mittlere CPU-Auslastung 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 Szenarien 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.
Änderungsverlauf
Aktualisierter Inhalt |
---|
Ein wichtiger Hinweis, in dem eine bewährte Methode für die Vorbereitung einer Masterzusammenführung einer großen Menge an indizierten Daten unter dem vollständigen Wiederherstellungsmodell beschrieben wird, wurde hinzugefügt. |
Ein wichtiger Hinweis, in dem eine bewährte Methode für die Vorbereitung einer Masterzusammenführung auf einem großen Multi-CPU-Computer beschrieben wird, wurde im Abschnitt "Optimieren der Leistung von Volltextindizes" hinzugefügt. |
Der Abschnitt "Verwendung des physischen Speichers" wurde verdeutlicht und erweitert. |
Siehe auch