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
- Aanbevelingen voor catalogusindexering
- Pas op de SSIS-serveronderhoudstaak
- Langzame prestaties wanneer u de SSIS-serveronderhoudstaak uitvoert om oude gegevens in SQL te verwijderen Server 2012