Compartilhar via


Gerenciar dados históricos com a política de retenção

Importante

O SQL do Azure no Edge será desativado em 30 de setembro de 2025. Para obter mais informações e opções de migração, veja o Aviso de aposentadoria.

Observação

O SQL do Azure no Edge encerrou o suporte à plataforma ARM64.

Depois que a política de retenção de dados é definida para um banco de dados e a tabela subjacente, uma tarefa de temporizador em segundo plano é executada para remover todos os registros obsoletos da tabela habilitada para retenção de dados. A identificação de linhas correspondentes e sua remoção da tabela ocorrem de forma transparente, na tarefa em segundo plano agendada e executada pelo sistema. A condição de idade das linhas da tabela é verificada com base na coluna filter_column especificada na definição da tabela. Se o período de retenção for definido como uma semana, por exemplo, as linhas de tabela qualificadas para limpeza atenderão a qualquer uma das seguintes condições:

  • Se a coluna de filtro usar o tipo de dados DATETIMEOFFSET, a condição será filter_column < DATEADD(WEEK, -1, SYSUTCDATETIME())
  • Caso contrário, a condição será filter_column < DATEADD(WEEK, -1, SYSDATETIME())

Fases de limpeza da retenção de dados

A operação de limpeza de retenção de dados consiste em duas fases:

  1. Descoberta: nesta fase, a operação de limpeza identifica todas as tabelas dentro dos bancos de dados de usuário para criar uma lista para limpeza. A descoberta é executada uma vez por dia.
  2. Limpeza: nesta fase, a limpeza é executada em todas as tabelas com retenção de dados finitos, identificada na fase de descoberta. Se a operação de limpeza não puder ser executada em uma tabela, essa tabela será ignorada na execução atual e será repetida na próxima iteração. Os seguintes princípios são usados durante a limpeza:
    • Se uma linha obsoleta estiver bloqueada por outra transação, essa linha será ignorada.
    • A limpeza é executada com um tempo limite de bloqueio padrão de 5 segundos. Se os bloqueios não puderem ser adquiridos nas tabelas dentro da janela de tempo limite, a tabela será ignorada na execução atual e será repetida na próxima iteração.
    • Se houver um erro durante a limpeza de uma tabela, essa tabela será ignorada e será recolhida na próxima iteração.

Limpeza manual

Dependendo das configurações de retenção de dados em uma tabela e da natureza da carga de trabalho no banco de dados, é possível que o thread de limpeza automática não remova completamente todas as linhas obsoletas durante a execução. Para permitir que os usuários removam manualmente linhas obsoletas, o procedimento armazenado sys.sp_cleanup_data_retention foi introduzido no SQL do Azure no Edge.

Este procedimento armazenado usa três parâmetros:

  • @schema_name: nome do esquema proprietário da tabela. Obrigatória.
  • @table_name: nome da tabela para a qual a limpeza manual está sendo executada. Obrigatória.
  • @rowcount: variável de saída. Retorna o número de linhas limpas pelo procedimento armazenado de limpeza manual. Opcional.

Para obter mais informações, confira sys.sp_cleanup_data_retention (Transact-SQL).

O exemplo a seguir mostra a execução do procedimento armazenado de limpeza manual para a tabela dbo.data_retention_table.

DECLARE @rowcnt BIGINT;
EXEC sys.sp_cleanup_data_retention 'dbo', 'data_retention_table', @rowcnt OUTPUT;
SELECT @rowcnt;

Como as linhas obsoletas são excluídas

O processo de limpeza depende do layout do índice da tabela. Uma tarefa em segundo plano é criada para executar a limpeza de dados obsoletos para todas as tabelas com período de retenção finito. A lógica de limpeza do índice rowstore (heap ou árvore B) exclui linhas antigas em partes menores (até 10.000), minimizando a pressão sobre o log de banco de dados e o subsistema de E/S. Embora a lógica de limpeza utilize o índice de árvore B necessário, a ordem das exclusões para as linhas mais antigas do que o período de retenção não pode ser garantida firmemente. Em outras palavras, não use uma dependência na ordem de limpeza em seus aplicativos.

Aviso

No caso de heaps e índices de árvore B, a retenção de dados executa uma consulta de exclusão nas tabelas subjacentes, o que pode entrar em conflito com gatilhos de exclusão nas tabelas. Você deve remover gatilhos de exclusão das tabelas ou evitar o uso da retenção de dados em tabelas que excluam gatilhos DML.

A tarefa de limpeza para os índices columnstore clusterizados remove grupos de linhas inteiros de uma só vez (normalmente contendo 1 milhão de linhas cada), o que é eficiente, especialmente quando os dados são gerados e envelhecem em um ritmo alto.

Diagrama de limpeza de retenção de dados.

A excelente compactação de dados e limpeza de retenção eficiente torna os índices columnstore clusterizados uma opção perfeita para cenários quando a sua carga de trabalho gera uma grande quantidade de dados rapidamente.

Monitorar a limpeza de retenção de dados

As operações de limpeza de política de retenção de dados podem ser monitoradas usando Eventos Estendidos no SQL do Azure no Edge. Para obter mais informações sobre eventos estendidos, confira Visão geral sobre os eventos estendidos.

Os eventos estendidos a seguir ajudam a acompanhar o estado das operações de limpeza.

Nome Descrição
data_retention_task_started Ocorre quando a tarefa em segundo plano para limpeza de tabelas com uma política de retenção é iniciada.
data_retention_task_completed Ocorre quando a tarefa em segundo plano para limpeza de tabelas com uma política de retenção é encerrada.
data_retention_task_exception Ocorre quando a tarefa em segundo plano para limpeza de tabelas com uma política de retenção falha, fora do processo de limpeza de retenção específico para essas tabelas.
data_retention_cleanup_started Ocorre quando o processo de limpeza de uma tabela com a política de retenção de dados é iniciado.
data_retention_cleanup_exception Ocorre quando o processo de limpeza de uma tabela com a política de retenção falha.
data_retention_cleanup_completed Ocorre quando o processo de limpeza de uma tabela com a política de retenção de dados é encerrado.

Além disso, um novo tipo de buffer de anel nomeado RING_BUFFER_DATA_RETENTION_CLEANUP foi adicionado à exibição de gerenciamento dinâmico sys.dm_os_ring_buffers. Essa exibição pode ser usada para monitorar operações de limpeza de retenção de dados.