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
- Rekommendationer för katalogindexering
- Se upp SSIS-serverunderhållsjobbet
- Långsam prestanda när du kör SSIS Server Maintenance Job för att ta bort gamla data i SQL Server 2012