Aktualizuj zapytania wolniej po włączeniu indeksu pełnotekstowego programu SQL Server

10

Mam witrynę asp.net z wieloma zapytaniami wstawiającymi, aktualizującymi i usuwającymi działającymi na mojej bazie danych.

Kilka dni temu tworzę indeks pełnotekstowy na dwóch kolumnach jednej z tabel. Po tym zdałem sobie sprawę, że kiedy witryna uruchamia zapytania dotyczące aktualizacji w tej tabeli, użycie pamięci i dysku w procesie SQL Server przeskakuje, a aktualizacje są wolniejsze. Zapytania przebiegały bez problemów z wydajnością przed utworzeniem indeksu pełnotekstowego.

Zdałem sobie również sprawę, że zapytania o aktualizację, które wcześniej były bardzo proste, są teraz skomplikowane, ponieważ plan wykonania zawiera teraz takie rzeczy, jak aktualizacja indeksu pełnotekstowego. Jest to część nowego planu wykonania, który stał się skomplikowany po włączeniu pełnego tekstu:

wprowadź opis zdjęcia tutaj

W ciągu kilku godzin, kiedy aktualizuję zawartość witryny, uruchomiłem 5000 zapytań aktualizacyjnych i myślę, że proces indeksowania pełnego tekstu jest wykonywany za każdym razem dla każdego wiersza.

Czy powinienem wyłączyć skanowanie pełnego tekstu na początku aktualizacji wierszy, a następnie włączyć je ponownie (jak w tym powiązanym pytaniu )?

Czy mogę nakazać programowi SQL Server zaprzestanie indeksowania pełnego tekstu na 5 minut, a następnie rozpocząć indeksowanie nowych danych?

Czy jest jakaś lepsza alternatywa? Korzystam z programu SQL Server 2012.

Mohammad Ha
źródło

Odpowiedzi:

2

W moim przypadku musiałem zmienić nieefektywną instrukcję UPDATE:

Przed:

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

Po:

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

To poprawiło wydajność z 4 minut do 5 sekund. Problem polegał na tym, że aktualizowałem wszystkie wiersze, nawet jeśli miały już wartość, którą chciałem przypisać.

fabiański
źródło
1

Jeśli go zatrzymasz (wyłączysz), indeks nie będzie dostępny dla zapytań z niego korzystających.

Możesz jednak ustawić śledzenie zmian na ręczne:

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

Możesz sprawdzić bieżącą wartość za pomocą tego zapytania:

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

Prawidłowe opcje to: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Określa, czy zmiany (aktualizacje, usunięcia lub wstawki) wprowadzone do kolumn tabeli objętych indeksem pełnotekstowym będą propagowane przez SQL Server do indeksu pełnotekstowego. Dane zmieniają się WRITETEXTi UPDATETEXTnie są odzwierciedlane w indeksie pełnotekstowym i nie są rejestrowane podczas śledzenia zmian.

Zobacz dokumentację Microsoft dla ALTER FULLTEXT INDEX (Transact-SQL) .

Julien Vavasseur
źródło