Pergunta

Eu tenho um aplicativo que registra a atividade em uma tabela (Oracle 10G). Os registros de registro devem ser mantidos por pelo menos 30 dias. Espero que cerca de 20 milhões de linhas sejam adicionadas a esta tabela todos os meses.

O DBA sugeriu que a tabela fosse dividida em partições contendo uma semana de dados. O script de manutenção semanal excluiria a partição mais antiga (deixando apenas 4 semanas de dados na tabela).

Qual seria a melhor maneira de particionar esta tabela de registro?

Foi útil?

Solução

Particionar uma tabela não é difícil - parece que você estará removendo os dados semanalmente, para que as cláusulas da partição pareçam

PARTITION "P2009_45"  VALUES LESS THAN 
(TO_DATE(' 2009-11-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
 PARTITION "P2009_46"  VALUES LESS THAN 
(TO_DATE(' 2009-11-09 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
... etc

Onde sua coluna de particionamento é sua coluna de interesse na tabela.

Comentários adicionais:

  • Se você puder atualizar para 11g, poderá aproveitar a partição de intervalo, o que é semelhante a esse intervalo, mas o Oracle gerenciará a criação de novas partições para você.
  • Se você vai deixar as partições rotineiramente, eu aconselho a fazer todos os índices na tabela localmente participados localmente para evitar as reconstruções que seriam necessárias com partições globais após operações de partição.
  • Se você tem uma boa idéia do número de entradas de log por mês e permanece relativamente constante, considere usar uma sequência (como chave primária) que é limitada a esse número e depois recicla de volta a 0. Em seguida, suas instruções de registro Deve se tornar "se fundir em ..." declarações que criam uma nova linha ou substituem a linha, se existir. Isso apenas garante que você manterá o número de linhas permitidas pelo valor máximo da sequência e não por um determinado intervalo de tempo, mas isso pode ser uma alternativa à partição (que, como o DVE aponta, é uma opção extra-densa)

Outras dicas

O esquema de particionamento mais provável seria Partição de faixa Seus dados na data da criação. A cada semana, você criava uma nova partição e deixava a mais antiga. O impacto dependerá de como esta tabela é usada / indexada.

Como é uma tabela de madeira, talvez não seja indexada, nesse caso a queda de uma partição terá pouco impacto: os objetos de referência não serão invalidados, a queda exigirá apenas um bloqueio de partição (e a partição mais antiga não deve ser inserida naquela hora).

Se a tabela for indexada, você precisará decidir se seus índices serão globais ou particionados. Os índices globais terão que ser reconstruídos quando você soltar uma partição (o que leva tempo, embora 20m linhas ainda sejam gerenciáveis). Você pode usar o UPDATE GLOBAL INDEXES Cláusula para manter os índices válidos após a queda da partição.

Os índices locais serão divididos como a tabela e podem ser menos eficientes que os índices globais (as varreduras do intervalo de índice terão que digitalizar cada índice local em vez de um índice comum se você não consultar a data). Esses índices não precisam ser atualizados após uma queda de partição.

20 milhões de linhas todos os meses e você só precisa manter 30 dias de dados? (Vale a pena cerca de um mês).

Mesmo com 12 meses em dados, não seria difícil consultar esta tabela (como uma tabela grande) com o índice correto. Inserir não é um problema com 1 linha na tabela de madeira ou 20 milhões.

A particionamento no Oracle também é um recurso que precisa ser pago se estiver correto, por isso também é caro (se você ainda não possui uma licença).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top