Phil Brammer se deparou com isso e uma série de outras coisas relacionadas ao cuidado e alimentação do catálogo SSIS, que ele aborda em seu post Recomendações de indexação do catálogo .
Problema raiz
A raiz do problema é que a MS tentou projetar o SSIS com RI em mente, mas eles eram preguiçosos e permitiram que as exclusões em cascata acontecessem em vez de manuseá-las explicitamente.
Resolução
Até que o MS mude como as coisas funcionam, a opção suportada é
Eu sei que no meu cliente atual, nós só carregamos dados de madrugada, então o SSISDB fica quieto durante o horário comercial.
Se executar o trabalho de manutenção durante um período de silêncio não for uma opção, você está pensando em criar suas próprias instruções de exclusão para tentar fazer com que as exclusões em cascata suguem menos .
No meu cliente atual, estamos executando cerca de 200 pacotes por noite nos últimos 10 meses e também temos 365 dias de histórico. Nossas maiores mesas, por uma ordem de grandeza são.
Schema Table RowCount
internal event_message_context 1,869,028
internal operation_messages 1,500,811
internal event_messages 1,500,803
O driver de todos esses dados,
internal.operations
tem apenas 3300 linhas, o que se alinha com o comentário de Phil sobre como esses dados crescem exponencialmente. Portanto, identifique o
operation_id
a ser purgado e a exclusão das tabelas folha trabalhando de volta ao núcleo, internal.operations
tabela. 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;
As advertências usuais se aplicam
- não confie em códigos aleatórios na internet
- use os diagramas do ssistalk e/ou tabelas do sistema para identificar todas as dependências
- talvez seja necessário segmentar apenas suas operações de exclusão em operações menores
- você pode se beneficiar ao descartar o RI para operações, mas certifique-se de reativá-los com a opção de verificação para que sejam confiáveis.
- consulte seu dba se as operações durarem mais de 4 horas
Edição de julho de 2020
Tim Mitchell tem um bom conjunto de artigos sobre Limpeza automática do catálogo SSIS e Uma maneira melhor de limpar o Banco de dados do catálogo SSIS e seu novo livro elegante The SSIS Catalog:Install, Manage , Proteja e monitore sua infraestrutura ETL corporativa
@Yong Jun Kim anotado nos comentários
Este é certamente o caso se você estiver usando um SSIS IR no Azure Data Factory. Você encontrará as tabelas "normais" ainda presentes, mas vazias, com o
*_scaleout
versões contendo todos os dados. Referências
- Recomendações de indexação de catálogo
- Cuidado o trabalho de manutenção do servidor SSIS
- Desempenho lento ao executar o trabalho de manutenção do servidor SSIS para remover dados antigos no SQL Servidor 2012