Фил Брамър се натъкна на това и множество други неща, свързани с грижата и захранването на каталога на SSIS, които той покрива в публикацията си Препоръки за индексиране на каталог .
Коренен проблем
Основният проблем е, че MS се опитаха да проектират SSIS с RI в ума, но те бяха мързеливи и позволиха каскадните изтривания да се случат, вместо да ги обработват изрично.
Резолюция
Докато MS не промени начина, по който работят нещата, поддържаната опция е
Знам, че при моя настоящ клиент зареждаме данни само в малките часове, така че SSISDB е тих през работното време.
Ако изпълнението на заданието по поддръжката по време на спокоен период не е опция, тогава гледате да изработите свои собствени изрази за изтриване, за да се опитате да накарате каскадните изтривания да смучат по-малко .
При сегашния ми клиент предлагаме около 200 пакета всяка вечер през последните 10 месеца и също така имаме 365 дни история. Нашите най-големи таблици в порядък са.
Schema Table RowCount
internal event_message_context 1,869,028
internal operation_messages 1,500,811
internal event_messages 1,500,803
Драйверът на всички тези данни, internal.operations
има само 3300 реда в него, което е в съответствие с коментара на Фил за това колко експоненциално нарастват тези данни.
И така, идентифицирайте operation_id
да бъдат изчистени и изтриването от листовите таблици да работи обратно към ядрото, internal.operations
таблица.
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;
Прилагат се обичайните предупреждения
- не се доверявайте на произволен код в интернет
- използвайте диаграмите от ssistalk и/или системните таблици, за да идентифицирате всички зависимости
- може да се наложи само да сегментирате операциите си за изтриване на по-малки операции
- може да се възползвате от премахването на RI за операции, но не забравяйте да ги активирате отново с опцията за проверка, за да им се вярва.
- консултирайте се с вашия dba, ако операциите продължават повече от 4 часа
Редакция от юли 2020 г.
Тим Мичъл има добър набор от статии за Автоматично почистване на SSIS каталог и По-добър начин за почистване на SSIS каталожна база данни и неговата фантастична нова книга Каталогът на SSIS:Инсталиране, управление , Защитете и наблюдавайте корпоративната си ETL инфраструктура
@Yong Jun Kim отбелязано в коментарите
Това със сигурност е случаят, ако използвате SSIS IR в Azure Data Factory. Ще откриете, че „нормалните“ таблици все още присъстват, но празни, с *_scaleout
версии, съдържащи всички данни.
Препратки
- Препоръки за индексиране на каталог
- Внимавайте заданието за поддръжка на SSIS сървър
- Бавна производителност, когато изпълнявате заданието за поддръжка на SSIS сървър за премахване на стари данни в SQL Сървър 2012