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
- Doporučení indexování katalogu
- Pozor úloha údržby serveru SSIS
- Pomalý výkon při spuštění úlohy údržby serveru SSIS k odstranění starých dat v SQL Server 2012