sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik de SSISDB opschonen?

Phil Brammer kwam dit en tal van andere dingen tegen die te maken hebben met de zorg en voeding van de SSIS-catalogus, die hij behandelt in zijn bericht Aanbevelingen voor catalogusindexering .

Rootprobleem

Het kernprobleem is dat MS probeerde de SSIS te ontwerpen met RI in gedachten, maar ze waren lui en lieten de trapsgewijze verwijderingen plaatsvinden in plaats van ze expliciet te verwerken.

Oplossing

Totdat MS verandert hoe dingen werken, is de ondersteunde optie

Ik weet dat we bij mijn huidige klant alleen gegevens in de kleine uurtjes laden, dus de SSISDB is stil tijdens kantooruren.

Als het uitvoeren van de onderhoudstaak tijdens een rustige periode geen optie is, dan ben je aan het kijken naar het maken van je eigen verwijderinstructies om te proberen de trapsgewijze verwijderingen minder zuigen te krijgen .

Bij mijn huidige klant hebben we de afgelopen 10 maanden ongeveer 200 pakketten per nacht uitgevoerd en zitten we ook op 365 dagen geschiedenis. Onze grootste tabellen zijn in orde van grootte.

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

De bestuurder van al die gegevens, internal.operations bevat slechts 3300 rijen, wat overeenkomt met de opmerking van Phil over hoe exponentieel deze gegevens groeien.

Identificeer dus de operation_id om te worden opgeschoond en het verwijderen van de bladtabellen werkt terug naar de kern, internal.operations tafel.

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;

Gebruikelijke voorbehouden zijn van toepassing

  • vertrouw geen code van randoms op internet
  • gebruik de diagrammen van ssistalk en/of systeemtabellen om alle afhankelijkheden te identificeren
  • het kan zijn dat u uw verwijderingsbewerkingen alleen in kleinere bewerkingen moet segmenteren
  • u kunt er baat bij hebben door RI voor bewerkingen te laten vallen, maar zorg ervoor dat u ze opnieuw inschakelt met de optie vinkje, zodat ze vertrouwd worden.
  • raadpleeg uw dba als operaties langer dan 4 uur duren

Bewerken juli 2020

Tim Mitchell heeft een goede reeks artikelen over SSIS-catalogus automatisch opschonen en Een betere manier om de SSIS-catalogusdatabase en zijn mooie nieuwe boek De SSIS-catalogus:installeren, beheren , beveilig en bewaak uw Enterprise ETL-infrastructuur

@Yong Jun Kim genoteerd in de opmerkingen

Dit is zeker het geval als je een SSIS IR gebruikt binnen Azure Data Factory. U vindt de "normale" tabellen nog steeds aanwezig maar leeg, met de *_scaleout versies die alle gegevens bevatten.

Referenties



  1. Het opvragen van combinaties van JSON levert vreemde resultaten op

  2. Datums vergelijken in SQL Server

  3. Records tussen 2 datums ophalen in MySQL

  4. MariaDB LOCALTIME() uitgelegd