sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag rensa upp SSISDB?

Phil Brammer stötte på detta och en mängd andra saker relaterade till vård och matning av SSIS-katalogen, som han tar upp i sitt inlägg Rekommendationer för katalogindexering .

Rootproblem

Rotproblemet är att MS försökte designa SSIS med RI i åtanke men de var lata och lät de kaskadraderingar ske kontra explicit hantering av dem.

Upplösning

Tills MS ändrar hur saker fungerar är alternativet som stöds

Jag vet att hos min nuvarande kund laddar vi bara data på småtimmarna så SSISDB är tyst under kontorstid.

Om att köra underhållsjobbet under en lugn period inte är ett alternativ, så funderar du på att skapa dina egna delete-satser för att försöka få de överlappande borttagningarna att suga mindre .

Hos min nuvarande kund har vi kört cirka 200 paket per natt under de senaste 10 månaderna och har också 365 dagars historia. Våra största bord i en storleksordning är.

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

Drivrutinen för all denna data, internal.operations har bara 3300 rader i sig, vilket stämmer överens med Phils kommentar om hur exponentiellt denna data växer.

Så identifiera operation_id som ska rensas och borttagningen från bladtabellerna arbetar tillbaka till kärnan, internal.operations bord.

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;

Vanliga varningar gäller

  • lita inte på kod från randoms på internet
  • använd diagrammen från ssisstalk och/eller systemtabeller för att identifiera alla beroenden
  • du kanske bara behöver segmentera dina raderingsåtgärder i mindre operationer
  • du kan dra nytta av att släppa RI för operationer men se till att du återaktiverar dem med kryssrutan så att de är betrodda.
  • konsultera din dba om operationen varar längre än 4 timmar

Redigera juli 2020

Tim Mitchell har en bra uppsättning artiklar om SSIS Catalog Automatic Cleanup och Ett bättre sätt att rensa upp SSIS Catalog Database och hans fina nya bok The SSIS Catalog:Install, Manage , Säkra och övervaka din Enterprise ETL-infrastruktur

@Yong Jun Kim noteras i kommentarerna

Detta är verkligen fallet om du använder en SSIS IR inom Azure Data Factory. Du hittar de "normala" tabellerna fortfarande tillgängliga men tomma, med *_scaleout versioner som innehåller all data.

Referenser



  1. Ansluta SQL Server 2008 till Outlook-kalendern?

  2. Hibernate, Postgresql:Kolumn x är av typen oid men uttrycket är av typen byte

  3. Ansluter applikationer som körs på Linux till Amazon Relational Database Services (RDS) för SQL Server

  4. Hur ställer man in "börja med" i sekvensen för att välja frågeresultat i SQL-server?