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)