Uma de nossas instâncias SQL tem um grande banco de dados MDS e praticamente 100% do tamanho se deve a uma tabela de mais de 300 milhões de linhas chamada stg.Stg_Project_Leaf
. Recentemente, começou a explodir nossas reconstruções de índice semanais, então preciso descobrir isso.
Pelo que posso dizer, esta é uma Tabela de Preparação de Membros Folha para uma entidade "Projeto", configurada e automatizada (por um consultor anterior) como parte de um processo ETL que cria cubos/relatórios de BI.
Parece que ele vem processando cerca de 10 mil linhas por meia hora nos últimos anos e nunca foi purgado. Quando eu verifico o ImportStatus_ID
, porém, vejo 0 linhas esperando para serem processadas. (A maioria é 1 - com sucesso, menos de 1% são 2 - com falha.)
Posso só TRUNCATE
esta mesa?
Este sistema está sendo usado de forma automatizada, não é como se as pessoas estivessem entrando no console do MDS e monitorando individualmente e revertendo as alterações. Encontrei algumas referências a procedimentos armazenados que limpam essas tabelas ( mdm.udpStagingClear
ou talvez mdm.udpDeletedMembersPurge
), mas não tenho certeza de qual delas é a que eu preciso, nem sei se eles explodiriam o log se tentassem fazer 300m fileiras de uma vez.
Resumindo : A resposta oficial é usar o novo proc
mdm.udpEntityStagingBatchTableCleanup
para limpar as tabelas de teste da entidade, mas na prática,DELETE
ouTRUNCATE
deve funcionar bem (ou pode ser necessário), desde que você entenda os detalhes do lote.Encontrei referência a um patch do SQL 2012 que adiciona 3 procedimentos armazenados ao MDS, incluindo o que preciso:
Consulte também este artigo para opções de limpeza agendada utilizando os mesmos procs.
Para o meu propósito, porém, eu ainda estava preocupado em explodir o log tran com mais de 300 milhões de linhas que precisavam ser excluídas, então examinei detalhadamente o funcionamento interno do
mdm.udpEntityStagingBatchTableCleanup
. Este proc armazenado faz o seguinte:@Model_ID
, anterior a@CleanupOlderThanDate
).DELETE
instruções dinâmicas para as tabelas Folha, Consolidada e Relacionamento correspondentes para cada umaDISTINCT Entity_ID
na tabela temporária.DELETE
instruções para cada tabela de entidade, filtrada por meio de uma junção à tabela temporária.mdm.tblStgBatch
si mesmo, novamente filtrado por junção à tabela temporária.Não há tentativa de limitar a quantidade de linhas excluídas de uma só vez e, no meu caso, as mais de 300 milhões de linhas são todas para um único
Entity_ID
, o que provavelmente explodiria o log de transações.A boa notícia, no entanto, é que, se eu pretendo remover todas
Entity_IDs
e todas as datas de qualquer maneira (o que faço), isso é funcionalmente equivalente a umTRUNCATE
, desde que eu tenha cuidado para não tentar no meio de um lote ativo.Por fim, embora não tenha encontrado nenhuma fonte oficial do MS que recomendasse explicitamente o truncamento dessas tabelas, encontrei vários artigos em que os DBAs fazem uma rotina
TRUNCATE
no início ou no final do processo de importação:Portanto, meu plano é fazer uma inicial
TRUNCATE
e, em seguida, agendarmdm.udpEntityStagingBatchTableCleanup
para ser executado periodicamente.