Udostępnij za pomocą


Przewodnik po procesie oczyszczania duchów

Wyczyszczenie duchów to proces w tle, który fizycznie usuwa wiersze oznaczone do usunięcia przez wyrażenia DML. Poniższy artykuł zawiera omówienie tego procesu.

Wiersze duchów

Wiersze usunięte ze stron na poziomie liścia indeksu nie są fizycznie usuwane ze strony. Zamiast tego wiersz jest oznaczony do przyszłego usunięcia lub upioru. Oznacza to, że wiersz pozostaje na stronie, ale zmieniany jest bit w nagłówku wiersza, aby wskazać, że wiersz jest ghostem (tak jakby "duchem"). Ma to na celu optymalizację wydajności podczas operacji usuwania. Duchy są niezbędne do blokowania na poziomie wiersza i transakcji izolacji migawki, w których aparat bazy danych musi obsługiwać starsze wersje wierszy.

Zadanie oczyszczania duchów

Wiersze oznaczone do usunięcia lub upiorne są czyszczone przez proces oczyszczania duchów w tle, gdy nie są już wymagane. Czyszczenie duchów jest uruchamiane okresowo i sprawdza, czy na jakiejkolwiek stronie znajdują się zghostowane wiersze. W przypadku znalezienia dowolnego z nich fizycznie usuwa te wiersze. Istnieje jeden wątek oczyszczania duchów dla wszystkich baz danych w wystąpieniu silnika baz danych.

Gdy wiersz jest oznaczony jako ghosted, baza danych jest oznaczona jako zawierająca takie wpisy. Proces oczyszczania duchów skanuje tylko takie bazy danych. Proces oczyszczania duchów oznacza bazę danych jako nieposiadającą wierszy oznaczonych jako ghosted po usunięciu wszystkich takich wierszy i pomija tę bazę przy kolejnym uruchomieniu, jeśli nie ma wierszy oznaczonych jako ghosted. Proces pomija również dowolną bazę danych, jeśli nie może uzyskać udostępnionej blokady w bazie danych. Ponawia próbę uzyskania w bazie danych przy następnym uruchomieniu.

Poniższe zapytanie zwraca przybliżoną liczbę zduplikowanych wierszy w bazie danych.

SELECT SUM(ghost_record_count) AS total_ghost_records,
       DB_NAME(database_id) AS database_name
FROM sys.dm_db_index_physical_stats(NULL, NULL, NULL, NULL, 'SAMPLED')
GROUP BY database_id
ORDER BY total_ghost_records DESC;

Wyłączanie oczyszczania duchów

W systemach o dużym obciążeniu z wieloma usunięciami proces oczyszczania może zmniejszyć wydajność, jeśli zastąpi wiele często używanych stron w puli buforów innymi stronami, które mają wiersze widmo. W związku z tym często używane strony muszą być ponownie odczytywane z dysku, generując dodatkowe operacje we/wy dysku i zwiększając opóźnienie zapytań. W takim przypadku można wyłączyć oczyszczanie duchów przy użyciu flagi śledzenia 661.

Bez czyszczenia duchów baza danych może być niepotrzebnie duża, co może również zmniejszyć wydajność z powodu dodatkowego użycia operacji we/wy i pamięci. Ponieważ proces oczyszczania duchów usuwa wiersze oznaczone jako duchy, wyłączenie procesu pozostawia te wiersze na stronie, uniemożliwiając ponowne wykorzystanie przez silnik bazy danych tej przestrzeni. Wymusza to dodanie danych do nowych stron przez aparat bazy danych, co prowadzi do nadętych plików bazy danych, a także może powodować podziały stron. Podziały stron zwiększają liczbę operacji we/wy dysku, co może zmniejszyć wydajność zapytań. Jeśli czyszczenie duchów jest wyłączone, w bazie danych może zabraknąć miejsca.

Ostrzeżenie

Wyłączenie procesu oczyszczania duchów na stałe nie jest zalecane.

Aby usunąć wiersze duchów po wyłączeniu oczyszczania duchów, ponownie skompiluj indeksy w tabelach, w których usunięto wiersze. Odbudowa indeksu powoduje utworzenie nowych stron na podstawie istniejących danych, pomijając w procesie usunięte wiersze.