sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu vyčistit SSISDB?

Phil Brammer narazil na toto a spoustu dalších věcí souvisejících s péčí a krmením katalogu SSIS, který popisuje ve svém příspěvku Doporučení indexování katalogu .

Problém s kořenem

Základní problém je v tom, že MS se pokusilo navrhnout SSIS s ohledem na RI, ale byli líní a dovolili, aby se kaskádová mazání odehrávala oproti tomu, aby je explicitně řešila.

Rozlišení

Dokud MS nezmění, jak věci fungují, podporovaná možnost je

Vím, že u mého současného klienta načítáme data pouze v nočních hodinách, takže SSISDB je během pracovní doby tichý.

Pokud spouštění úlohy údržby během klidného období není možné, pak se snažíte vytvořit vlastní příkazy delete, abyste se pokusili dosáhnout toho, aby kaskádová mazání méně nasávala .

U mého současného klienta jsme posledních 10 měsíců provozovali asi 200 balíčků za noc a jsme také na 365 dnech historie. Naše řádově největší stoly jsou.

Schema    Table                   RowCount
internal  event_message_context   1,869,028
internal  operation_messages      1,500,811
internal  event_messages          1,500,803

Ovladač všech těchto dat, internal.operations má pouze 3300 řádků, což odpovídá Philově komentáři o tom, jak exponenciálně tato data rostou.

Identifikujte tedy operation_id být vyčištěn a odstranění z listových tabulek funguje zpět do jádra, internal.operations tabulka.

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;

Platí obvyklá upozornění

  • nedůvěřujte náhodným kódům na internetu
  • použijte diagramy ze ssistalk a/nebo systémových tabulek k identifikaci všech závislostí
  • možná bude potřeba pouze rozdělit operace mazání na menší operace
  • můžete mít prospěch z vypuštění RI pro operace, ale nezapomeňte je znovu povolit pomocí možnosti zaškrtnutí, aby byly důvěryhodné.
  • Pokud operace trvají déle než 4 hodiny, poraďte se se svým dba

Úprava z července 2020

Tim Mitchell má dobrou sadu článků o Automatické čištění katalogu SSIS a Lepší způsob, jak vyčistit Katalogová databáze SSIS a jeho luxusní nová kniha Katalog SSIS:Instalace, správa , Zabezpečte a monitorujte svou podnikovou infrastrukturu ETL

@Yong Jun Kim uvedeno v komentářích

To je určitě případ, pokud používáte SSIS IR v Azure Data Factory. Zjistíte, že "normální" tabulky jsou stále přítomné, ale prázdné, s *_scaleout verze obsahující všechna data.

Odkazy



  1. Nainstalujte a používejte Percona Toolkit na Centos 7

  2. Získejte vše za a před určitým znakem v SQL Server

  3. ALTER SESSION SET nls_date_format nefunguje v APEX. Nicméně funguje v SQL Developer

  4. Vytvořte tabulku v SQL Server 2017