Phil Brammer natknął się na to i wiele innych rzeczy związanych z opieką i karmieniem katalogu SSIS, które opisuje w swoim poście Zalecenia dotyczące indeksowania katalogów .
Problem główny
Główny problem polega na tym, że MS próbował zaprojektować SSIS z myślą o RI, ale były leniwe i pozwalały na kaskadowe usuwanie zamiast jawnego ich obsługi.
Rozdzielczość
Dopóki MS nie zmieni sposobu działania, obsługiwaną opcją jest
Wiem, że u mojego obecnego klienta ładujemy dane tylko we wczesnych godzinach porannych, więc SSISDB jest cichy w godzinach pracy.
Jeśli uruchomienie zadania konserwacji w okresie ciszy nie jest opcją, musisz stworzyć własne instrukcje usuwania, aby spróbować uzyskać kaskadowe usuwanie mniej ssania .
U mojego obecnego klienta uruchamiamy około 200 paczek dziennie przez ostatnie 10 miesięcy, a także mamy 365 dni w historii. Nasze największe stoły są o rząd wielkości.
Schema Table RowCount
internal event_message_context 1,869,028
internal operation_messages 1,500,811
internal event_messages 1,500,803
Sterownik wszystkich tych danych, internal.operations
ma tylko 3300 wierszy, co jest zgodne z komentarzem Phila o tym, jak wykładniczo rosną te dane.
Zidentyfikuj więc operation_id
do wyczyszczenia, a usuwanie z tablic liści działa z powrotem do rdzenia, internal.operations
tabela.
USE SSISDB;
SET NOCOUNT ON;
IF object_id('tempdb..#DELETE_CANDIDATES') IS NOT NULL
BEGIN
DROP TABLE #DELETE_CANDIDATES;
END;
CREATE TABLE #DELETE_CANDIDATES
(
operation_id bigint NOT NULL PRIMARY KEY
);
DECLARE @DaysRetention int = 100;
INSERT INTO
#DELETE_CANDIDATES
(
operation_id
)
SELECT
IO.operation_id
FROM
internal.operations AS IO
WHERE
IO.start_time < DATEADD(day, [email protected], CURRENT_TIMESTAMP);
DELETE T
FROM
internal.event_message_context AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
DELETE T
FROM
internal.event_messages AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
DELETE T
FROM
internal.operation_messages AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
-- etc
-- Finally, remove the entry from operations
DELETE T
FROM
internal.operations AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
Obowiązują zwykłe zastrzeżenia
- nie ufaj kodowi losowemu w internecie
- użyj diagramów z ssistalk i/lub tabel systemowych, aby zidentyfikować wszystkie zależności
- może być konieczne tylko segmentowanie operacji usuwania na mniejsze operacje
- Możesz skorzystać z porzucenia RI dla operacji, ale upewnij się, że włączysz je ponownie za pomocą opcji check, aby były zaufane.
- skonsultuj się ze swoją dba, jeśli operacje trwają dłużej niż 4 godziny
Edycja z lipca 2020 r.
Tim Mitchell ma dobry zestaw artykułów na temat Automatyczne czyszczenie katalogu SSIS i Lepszy sposób na oczyszczenie Baza danych katalogu SSIS i jego wymyślna nowa książka Katalog SSIS:instalacja, zarządzanie , zabezpiecz i monitoruj swoją infrastrukturę ETL przedsiębiorstwa
@Yong Jun Kim odnotowane w komentarzach
Jest to z pewnością przypadek, jeśli używasz SSIS IR w Azure Data Factory. Znajdziesz „normalne” tabele nadal obecne, ale puste, z *_scaleout
wersje zawierające wszystkie dane.
Referencje
- Zalecenia dotyczące indeksowania katalogów
- Uwaga zadanie konserwacji serwera SSIS
- Słaba wydajność po uruchomieniu zadania konserwacji serwera SSIS w celu usunięcia starych danych w SQL Serwer 2012