Estamos implementando um novo recurso em nosso sistema que fará com que cerca de um milhão de registros (cada registro é minúsculo, basicamente um GUID, uma data e quatro smallint
campos) sejam removidos de uma tabela todas as noites. Basicamente, é uma tabela de cache e, quando os dados tiverem 7 dias, fazemos:
DELETE FROM scheduleCache WHERE schDateCreated < '2013-08-26
Isso será executado todas as noites à 1h e limpará cerca de um milhão de registros toda vez que for executado.
Há algo que eu deva observar ou fazer para uma tabela como esta? Quaisquer propriedades que eu deva colocar na mesa ou quaisquer rotinas que eu deva executar regularmente para "limpar"? Eu nunca lidei com uma mesa como esta antes.
A tabela tem um único índice clusterizado (GUID + um dos smallint
campos) e temos uma reconstrução de índice semanal que é executada nas manhãs de domingo.
O problema de excluir grandes porções de uma tabela está longe de ser um problema trivial. A melhor abordagem, de longe, é o particionamento. Um esquema de partição diário com uma janela deslizante é realmente uma solução mágica para esse problema, consulte Como implementar uma janela deslizante automática em uma tabela particionada .
Se você não puder pagar pelo particionamento (por exemplo, licença não empresarial no local), recomendo o clustering por
schDateCreated
. Se você precisar de uma chave primária no GUID+smallint, mova-a para não agrupada. Exclua em lotes (por exemplo.TOP 10000
), em loop, para reduzir a pressão no tronco. Considere atualizar as estatísticas após a operação.Uma solução seria armazenar os dados em uma tabela por dia, eliminando as tabelas conforme elas envelhecem fora do cache. As tabelas teriam nomes como cache_(data juliana).
Outra solução seria ter um conjunto de tabelas cache_0 a cache_n, truncando cada tabela antes de usá-la. Você usaria a tabela cache_((data juliana) modulo (período do ciclo)) para cada dia.
Você precisaria lidar com o final do ano com cuidado, pois passaria de 365 ou 366 para 0 em qualquer uma das soluções.