Ustawienia czyszczenia duchów

10

Korzystam z wysokiej bazy danych transakcyjnych (średnio ~ 175 tys. Transakcji / minutę, prawie 9 mln rekordów na godzinę dodawanych i usuwanych)

Do niedawna nie stanowiło to większego problemu, ponieważ dodawaliśmy i usuwaliśmy ~ 7,5 mln rekordów, ale przy najnowszych napływach danych czyszczenie duchów nie wydaje się być w stanie nadążyć za czyszczeniem nieużywane miejsce w tabelach / indeksach.

Kilka dni temu osiągnęliśmy 53 GB „Niewykorzystanej przestrzeni” na 16 stołach (głównie 2 z nich), więc w rezultacie zaczęliśmy analizować proces czyszczenia duchów, aby stwierdzić, że działa on raz na 5 sekund i na 10 stronach.

Moje obecne rozwiązanie polega na tym, że wcześnie rano uruchamiam trzy wątki następującego polecenia:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

aby nadrobić zaległości z poprzedniej nocy (kiedy większość naszych operacji usuwania ma miejsce)

Zastanawiam się, czy jest jakiś sposób na zmianę domyślnych ustawień z 5 sekund i 10 stron na sekundę lub na ponad 20 stron, czy jest jakikolwiek sposób, czy powinienem nadal rozpędzać wiele procedur czyszczenia, aby usunąć dane lub jeśli istnieją inne działania, które mogą w tym pomóc

Ponowne indeksowanie działa na najbardziej efektywnych indeksach przynajmniej raz w tygodniu (większość odbywa się co drugi dzień)

SQL Server 2012 Enterprise SP3_CU8 (jutro aktualizacja do CU9) w klastrze o wysokiej dostępności AlwaysOn również z replikacją (dystrybucja na oddzielnym serwerze)

Ste Bov
źródło

Odpowiedzi:

4

Zastanawiam się, czy jest jakiś sposób na zmianę domyślnych ustawień z 5 sekund i 10 stron na sekundę lub na ponad 20 stron

Nie, nie ma żadnego. Przynajmniej nie wiem na razie :-)

jeśli są jakieś inne działania, które mogą w tym pomóc

Z bloga Paula Randala - Jedną z metod, które ludzie czasem rozważają, jest wymuszenie czyszczenia duchów, aby wyczyścić wszystko, wykonując skanowanie tabeli lub indeksu (w ten sposób ustawiając w kolejce wszystkie usunięte rekordy do zadania czyszczenia duchów).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

Czy istnieje możliwość podzielenia tabeli na partycje i wyczyszczenia starej partycji zamiast usuwania ? FYI .. SQL Server 2016 i nowsze wersje umożliwiają obcinanie również poszczególnych partycji.

Możesz także (TESTOWAĆ i zaimplementować) - wyłączyć czyszczenie duchów (flaga śledzenia 661), a następnie rebuild index WITH ONLINE = ONopcję, ponieważ używasz wersji Enterprise.

Jeśli używasz AlwaysON (z asynchronizacją) z replikacją, pamiętaj, aby włączyć flagę śledzenia 1448 - pozwala czytnikowi dziennika replikacji przejść do przodu, nawet jeśli asynchroniczne repliki wtórne nie potwierdziły odbioru zmiany.

Pamiętaj, aby przeczytać Usuwa dzielone strony i przekazywane duchy od Paula White'a, aby sprawdzić, czy twoje tabele mają wyzwalacze lub kolumny LOB, które by spowolniły.

Kin Shah
źródło