Aktualisieren Sie Abfragen langsamer, nachdem Sie den SQL Server-Volltextindex aktiviert haben


10

Ich habe eine asp.net-Website mit vielen Abfragen zum Einfügen, Aktualisieren und Löschen, die für meine Datenbank ausgeführt werden.

Vor einigen Tagen habe ich einen Volltextindex für zwei Spalten einer Tabelle erstellt. Danach stellte ich fest, dass die Speicher- und Festplattennutzung des SQL Server-Prozesses springt und die Aktualisierungen langsamer sind, wenn auf der Website Aktualisierungsabfragen für diese Tabelle ausgeführt werden. Die Abfragen wurden ohne Leistungsprobleme ausgeführt, bevor der Volltextindex erstellt wurde.

Ich habe auch festgestellt, dass Aktualisierungsabfragen, die zuvor sehr einfach waren, jetzt kompliziert sind, da der Ausführungsplan jetzt Dinge wie die Aktualisierung des Volltextindex enthält. Dies ist Teil eines neuen Ausführungsplans, der nach dem Aktivieren von Volltext kompliziert wurde:

Geben Sie hier die Bildbeschreibung ein

In einigen Stunden, in denen ich den Inhalt der Website aktualisierte, wurden 5000 Aktualisierungsabfragen ausgeführt, und ich denke, dass die Volltextindizierung jedes Mal für jede Zeile durchgeführt wird.

Sollte ich die Volltextsuche beim Start der Zeilenaktualisierung deaktivieren und dann wieder aktivieren (wie in dieser verwandten Frage )?

Kann ich SQL Server anweisen, die Volltextindizierung für 5 Minuten zu stoppen und dann mit der Indizierung neuer Daten zu beginnen?

Gibt es eine bessere Alternative? Ich verwende SQL Server 2012.

Antworten:


2

In meinem Fall musste ich eine ineffiziente UPDATE-Anweisung ändern:

Vor:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

Nach:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

Dies verbesserte die Leistung von 4 Minuten auf 5 Sekunden. Das Problem war, dass ich alle Zeilen aktualisiert habe, auch wenn sie bereits den Wert hatten, den ich zuweisen wollte.


1

Wenn Sie es stoppen (deaktivieren), ist der Index für Abfragen, die ihn verwenden, nicht verfügbar.

Sie können die Änderungsverfolgung jedoch auf manuell einstellen:

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO

Sie können den aktuellen Wert mit dieser Abfrage überprüfen:

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

Gültige Optionen sind: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Gibt an, ob Änderungen (Aktualisierungen, Löschungen oder Einfügungen) an Tabellenspalten, die vom Volltextindex abgedeckt werden, von SQL Server an den Volltextindex weitergegeben werden. Daten ändern sich durch WRITETEXTund UPDATETEXTwerden nicht im Volltextindex wiedergegeben und nicht mit Änderungsverfolgung erfasst.

Weitere Informationen finden Sie in der Microsoft-Dokumentation zu ALTER FULLTEXT INDEX (Transact-SQL) .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.