Páginas

20 de abr. de 2012

Transformando tabelas particionadas em tabelas heap

Olá pessoal,

     No artigo de hoje vou demonstrar como transformar uma tabela particionada em uma tabela heap sem ter que apagar os dados da tabela existente. Estou escrevendo este artigo, neste momento, porque acabei de fazer este procedimento em um Banco de Dados (BD) de Testes na empresa em que eu trabalho. 
  
     Neste BD foi criada uma tabela particionada para que fossem efetuados testes de performance. Nela foi dada uma carga de 805.403.722 linhas. Para implementá-la em um BD de Produção precisaríamos obter licenciamento da option Oracle Partitioning. Por falta de "money" para comprar o licenciamento desta option, não vamos mais implementar a tabela particionada em produção e por isso tivemos que transformá-la em tabela heap.
     


     Segue abaixo um passo-a-passo para efetuar a transformação:

------------------------------------------------------------------------
PASSO-A-PASSO
------------------------------------------------------------------------
  
--------------------------------------------------------------------------
    Para iniciar o passo-a-passo abaixo, é necessário conectar-se previamente no Banco de Dados desejado, através do SQL Plus ou outra ferramenta compatível, com um usuário que tenha o privilégio SYSDBA.
--------------------------------------------------------------------------
  
   
     Passo 1: Combinando partições:
          Partindo do princípio que teremos uma tabela particionada chamada TAB_PART que contém 4 partições, iremos combinar as participações, de duas em duas, até restar uma só. Só é possível fazer a combinação (merge) de duas em duas, por isso, se você tiver muitas partições este processo pode ser um pouco demorado (comigo foi, pois a tabela que combinei tinha 30 partições).  Ao efetuar as combinações, é necessário que as duas partições sejam combinadas na partição maior, ou seja, na partição que tem os números de blocos maiores. Se você fez o particionamento por range de data, por exemplo, é fácil identificar isso. É só combinar as duas partições na partição que tem as linhas com os maiores valores na coluna de data do particionamento!
          Exemplo:
             ALTER TABLE TAB_PART MERGE PARTITIONS P1, P2 INTO PARTITION P2;
             ALTER TABLE TAB_PART MERGE PARTITIONS P2, P3 INTO PARTITION P3;
             ALTER TABLE TAB_PART MERGE PARTITIONS P3, P4 INTO PARTITION P4;
   
          Obs.: Ao término da execução dos comandos acima, sobrará somente a partição  P4.


     Passo 2: Criando uma nova tabela heap:
        Criaremos agora uma nova tabela heap chamada TAB_HEAP, contendo a mesma estrutura (colunas, dados e constraints) da tabela particionada. Para criar essa tabela executaremos os  passos a seguir:
  
           a) Execute a procedure GET_DDL da package DBMS_METADATA para extrair o código DDL da tabela particionada, como no exemplo abaixo:
             SELECT DBMS_METADATA.GET_DDL('TABLE', 'TAB_PART', 'OWNER') FROM dual; 
    
           b) Pegue o script resultado do passo anterior e altere-o removendo as partições existentes e renomeando todas as constraints existentes, para um nome diferente do atual, de mode que não exista conflito de nomes entre constraints da tabela particionada e constraints da tabela heap. Aconselho guardar os nomes das constraints originais para usá-los novamente nos passos finais. O resultado final deste passo é um script para criar uma tabela heap.

           c) Execute o script do passo anterior para criar a tabela heap.
   
     Passo 3: Transferindo dados da tabela particionada para a tabela heap:
        Agora iremos transferir os dados da tabela particionada para a nova tabela heap, executando o comando abaixo:
                 ALTER TABLE TAB_PART EXCHANGE PARTITION P4 WITH TABLE TAB_HEAP;

              Obs.: Este passo tem um tempo de execução muito rápido. Após o seu término, verifique que a tabela particionada não possui mais dados. Todos eles foram transferidos para a tabela heap!
   
     Passo 4: Apagando a tabela particionada:
        Estamos chegando aos passos finais. A gente já tem uma tabela heap com os dados da tabela particionada, portanto, não precisamos mais da tabela particionada. Para apagá-la, execute o comando abaixo:
                 DROP TABLE  TAB_PART PURGE;
   
     Passo 5: Renomeando a tabela heap:
        Agora iremos renomear a tabela heap para o nome original (nome anterior da tabela particionada):
                 ALTER TABLE  TAB_HEAP RENAME TAB_PART;

     Passo 6: Renomeando as constraints da tabela heap:
        Para finalizar, iremos renomear as constraints da tabela heap para o nome original delas (nome anterior das constraints na tabela particionada), como no exemplo abaixo:
                 ALTER TABLE  TAB_HEAP RENAME CONSTRAINT  nome_novo TO  nome_original;

  
  
     Pronto! Terminamos de transferir todos os dados uma tabela particionada para uma tabela heap, sem apagar os dados da primeira! Existem outras formas de chegar ao mesmo resultado (Ex.: Export/Import ou CTAS), mas não sem apagar os dados da tabela de origem.
  
  
Por hoje é só!


[]s




Referências:
     http://www.techiegyan.com/2008/06/26/oracle-removing-partitioning-from-tables-without-deleting-data/
     http://docs.oracle.com/cd/B10501_01/server.920/a96521/partiti.htm#6562

Nenhum comentário:

Postar um comentário