Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę wyczyścić SSISDB?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podziel wartości na wiele wierszy

  2. Błąd składni SQL 2008 R2 CTE w instrukcji SELECT

  3. Jaki jest najlepszy sposób na pisanie wielką literą każdego słowa w ciągu w SQL Server

  4. Jak mogę wydajnie odczytać ponad 15 milionów rekordów z SQL Server, wykonać pewne przetwarzanie i zapisać je do zwykłego pliku?

  5. Znalezienie mediany między DWOMA datami SQL Server 2008