Udostępnij za pośrednictwem


Indeksy pełnotekstowe przestają wypełniać się przez 30 minut w programie SQL Server

W tym artykule przedstawiono problemy, które mogą wystąpić podczas pracy z wieloma indeksami pełnotekstowymi i rozwiązaniami rozwiązania tych problemów.

Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 4045273

Symptomy

Załóżmy, że na serwerze jest zainstalowany program Microsoft SQL Server. Rozważ następujące scenariusze:

  • Scenariusz 1:

    Istnieje kilka indeksów pełnotekstowych w co najmniej jednej bazie danych, a populacja tych indeksów pełnotekstowych kończy się niemal w tym samym czasie.

  • Scenariusz 2:

    Tworzysz wykaz pełnotekstowy zawierający wiele indeksów pełnotekstowych, a populacja tych indeksów pełnotekstowych kończy się niemal w tym samym czasie.

  • Scenariusz 3.

    Ponownie skompilujesz co najmniej jeden wykaz pełnotekstowy, w którym kilka indeksów kończy wypełnianie w czasie lub w pobliżu.

  • Scenariusz 4.

    Należy ręcznie uruchomić ALTER FULLTEXT CATALOG REORGANIZE katalog zawierający wiele indeksów pełnotekstowych.

W dowolnej z tych sytuacji, jeśli włączysz flagę śledzenia (TF) 7603, aby wyświetlić pełne rejestrowanie dla populacji pełnotekstowej w dzienniku błędów programu SQL Server, zobaczysz komunikaty podobne do następujących:

Data/godzina SPIDIFTS: CFTWICrawl::Close, pełne przeszukiwanie zostało zakończone, planowanie scalania głównego dla typu przeszukiwania: 1, DBid 7, catid 5, tid 13847411
Date/Time SPID CFTMasterMergeListManager::QueueMasterMerge queued MM item for DBid 7, catalog 5, tblid 13847411
Date/Time SPID IFTS: CFTWIAutoCrawlFullPass::ExecUnit::D oUnitWork: Znaleziono istniejące przeszukiwanie, więc wróć bez pełnego przekazywania autocrawl, DBid 7 Catid 5 Objid 13847411

Ponadto zobaczysz 30-minutowe oczekiwanie na scalenie wzorca, a raporty dziennika, które scaliły wzorzec, zostało przerwane:

Data/godzina IFTS SPID: Elementy robocze scalania głównego zostały przerwane, ponieważ czekało wstępnie przez ponad 30 minut m_DBid 7, m_objid 13847411
Operacja scalania wzorca alertu SPID daty/godziny nie została wykonana dla rekordu DBid 7, 13847411 objid, więc wykonywanie zapytań względem indeksu będzie powolne. Uruchom polecenie alter fulltext catalog reorganize.
Date/Time SPID CFTMasterMergeListManager::RemoveMasterMerge wydany element MM dla DBid 7, wykaz 5, tblid 13847411
Data/godzina SPID Scalanie wzorca rozpoczęło się na końcu pełnego przeszukiwania tabeli lub widoku indeksowanego "[DB1]. [dbo]. [Table1]" nie powiodło się z HRESULT = '0x80000049'. Identyfikator bazy danych to "7", identyfikator tabeli to 13847411, identyfikator wykazu: 5.

Przyczyna

Scalanie wzorca jest uruchamiane automatycznie na końcu pełnej lub przyrostowej populacji na indeks. Proces scalania głównego zmniejsza liczbę fragmentów indeksu pełnotekstowego, aby zapytania korzystające z indeksu pełnotekstowego stały się negatywnie dotknięte wydajnością indeksu pełnotekstowego.

Główny proces scalania używa wielu wątków w celu zmniejszenia fragmentacji na indeks pełnotekstowy. Program SQL Server ogranicza liczbę współbieżnych scaleń głównych, które są uruchamiane w tym samym czasie. Po osiągnięciu progu każdy indeks pełnotekstowy, który próbuje uruchomić scalanie wzorca, będzie mieć 30-minutowe opóźnienie oczekiwania. Aktualizacja indeksu pełnotekstowego nie zostanie uruchomiona w tym okresie oczekiwania. Scalanie wzorca zostanie wznowione, jeśli wystąpi jedna z następujących dwóch czynności:

  • Po zakończeniu kolejnej pomyślnej populacji przyrostowej i pomyślnym uruchomieniu scalania głównego.

  • Ręcznie uruchom scalanie wzorca, uruchamiając następujące polecenie:

     ALTER FULLTEXT CATALOG catalog_name REORGANIZE
    

Uwaga 16.

Powyższe dwie opcje mogą nadal osiągać limit scalania głównego w zależności od liczby scalania wzorca uruchomionego w tym czasie.

Rozwiązanie

Aby obejść ten proces, wypróbuj następujące metody:

  • Metoda 1 (zalecana): ogranicz liczbę indeksów pełnotekstowych w tym samym wykazie. Zalecamy co najmniej 7. Duże tabele powinny znajdować się we własnym wykazie pełnotekstowym. Jest to najlepsze rozwiązanie w zakresie wydajności podczas ponownego kompilowania lub reorganizacji indeksów. Ta metoda może pomóc, gdy Change_tracking jest automatycznie.

  • Metoda 2. Ustaw Change_Tracking na Ręczne, używając następującego polecenia:

    ALTER FULLTEXT INDEX ON table_name set Change_tracking = Manual
    

    Następnie utwórz zadania programu SQL Server, aby rozłożyć się podczas uruchamiania populacji przyrostowych. Powoduje to mniejsze nakładanie się podczas uruchamiania scalania głównego po populacji indeksu.