Social Icons

10 de ago. de 2016

Compressão de tabelas no Oracle Database


  
ARTIGO ATUALIZADO EM 19/11/2018

Olá pessoal,

     Muitos sabem o que é compressão de dados e como ela é importante para nos ajudar a economizar espaço em disco e custos de armazenamento. O que observo porém, entre alunos e na comunidade Oracle, é que há muita confusão, no caso de tabelas, sobre quando é que a compressão nos traz benefícios, e quando realmente podemos usá-la no Oracle Database. Falaremos mais sobre isso neste artigo!
     
     A compressão de tabelas no Oracle Database surgiu na versão 9i, e inicialmente atuava somente em operações de carga direta, no nível de blocos. Este primeiro recurso de compressão de tabelas chama-se hoje Basic Table Compression, No 11G, a Oracle criou um novo recurso de compressão de tabelas para permitir a compactação de dados também durante os DMLs convencionais, e este recurso chama-se hoje OLTP Table Compression (11GR2 e versões superiores)Diferenças principais entre os 2 recursos:

          - Basic Table Compression:
               - Atua somente em cargas diretas (insert com hint append ou sql loader), comandos ALTER TABLE MOVE e CTAS;
               - É totalmente gratuito;
               - Comprime os dados em até 10x;
               - Ótimo para ambientes OLAP ou tabelas de histórico de dados;
               - Sintaxe para uso: COMPRESS (ou COMPRESS FOR DIRECT_LOAD OPERATIONS, comando utilizado até a versão 11GR1).
  
          - OLTP Table Compression:
               - Possui menos restrições que o recurso anterior, atuando também diretamente nos comandos DML;
               - Comprime de 2x a 4x os dados das operações DML;
               - Faz parte da option Advanced Compression, portanto, para usá-lo você precisa adquirir o licenciamento dela;.
               -  É ótimo para ambientes OLTP;
               -  Sintaxe para uso: COMPRESS FOR OLTP (ou COMPRESS FOR ALL OPERATIONS, comando utilizado até a versão 11GR1);

      Além destes recursos de compressão, existe ainda a compressão no nível de índices (Index Compression), que também é gratuita, e vários outros recursos de compressão que fazem parte da option Advanced Compression, e que não iremos abordar neste artigo. O que quero ressaltar aqui, é que os 2 principais recursos para compressão de tabelas são aqueles que acabei de apresentar e o primeiro deles (Basic Table Compression) você pode usar na versão Enterprise Edition do Oracle Database sem ter que gastar um tostão a mais com licenciamento adicional (isso gera dúvidas em muitos profissionais que trabalham com Oracle). Seguem abaixo exemplos de comandos para criar uma tabela com compressão básica habilitada, e outro para alterar uma tabela habilitando nela a compressão básica:

-- Exemplo 1: CTAS para criar uma tabela vazia (rownum = 0) com compressão básica já habilitada:
create table tab_obj compress basic
as select * from all_objects where rownum = 0;

-- Exemplo 2: Alterando uma tabela existente para habilitar compressão básica:
alter table tab_obj2 compress basic;
alter table tab_obj2 move; -- somente após o MOVE é que os dados são compactados

Obs.: Depois que você execute o ALTER TABLE ... MOVE os índices da tabela ficarão em estado UNUSABLE, portanto, você precisará executar um REBUILD neles!

   
       Outro ponto que acho interessante comentar, para fins de aprendizado, é o conceito de compressão X desduplicação. Apesar do nome do recurso apresentado no Oracle sugerir que há compressão de dados, na verdade o que ele faz nestes casos não é compressão, mas sim desduplicação de dados. Para mais informações sugiro a leitura do artigo Compression in Oracle – Part 1: Basic Table Compression, muito bem explicado pelo grande Jonathan Lewis.

     Seguem abaixo alguns pontos importantes que devem ser considerados ao usar compressão em tabelas:

          1- Tabelas compactadas apesar de consumirem mais CPU, economizam espaço em disco e reduzem a quantidade de I/O. Isso normalmente otimiza o desempenho de instruções SELECT e DELETE. Veja na Imagem 01 um ótimo exemplo que peguei de uma apresentação do Oracle ACE Director Carl Dudley (ver referências), que mostra o mesmo SQL em tabelas similares (com estruturas idênticas, porém uma compactada e a outra não), e o tempo de execução em cada uma delas. Está claro no exemplo que o tempo de CPU na tabela compactada é maior, porém o tempo de I/O é muito menor... e no final das contas, o desempenho geral ficou 264% mais rápido!

Imagem 01 - Tempo de execução de SQLs em tabela compactada X não compactada

          2- Os blocos de dados permanecem compactados em memória (na Buffer Cache), portanto, o uso de compressão pode te ajudar a resolver problemas de subdimensionamento de memória, quando for detectado, por exemplo, que o tamanho da Buffer Cache está pequena para o ambiente em execução;

          3- Compressão de dados normalmente degrada o desempenho das atualizações e inserções, portanto, não se assuste se nos INSERTs de uma determinada tabela compactada você começar a encontrar, por exemplo, wait events cell single block physical read;



     Recentemente tive uma experiência alterando a definição de uma tabela de histórico de um dos sistemas de um BD de produção que administro, e apresento abaixo os resultados de testes que fiz ao transformar a tabela não compactada, em tabela compactada (ver Imagem 02):

Imagem 02 - Testes de compactação de tabela

   Resumindo o que vemos na imagem 02, a tabela LOG_ORIGINAL, não compactada, tinha o tamanho de 40,37 GB. Criei um clone dela, compactada, com o nome LOG_HISTORICO e executei um INSERT com hint APPEND nela. O tamanho da LOG_HISTORICO ficou igual a 34.47 GB (redução de 14,61%). Em seguida, criei outro clone da tabela LOG_ORIGINAL, com o nome LOG_HISTORICO_2, via comando CTAS, e o tamanho final desse último clone ficou igual à 30,68 GB (redução de 24%).

     Em outros testes mais recentes que fiz, alterei uma tabela existente para permitir a compressão básica e em seguida executei o comando ALTER TABLE... MOVE. Resultado: a tabela que tinha um tamanho inicial de 58,20 GB ficou com tamanho final de 33,39 GB, ou seja, uma redução melhor ainda, com índice de 42,62%.

Bom pessoal, por hoje é só!
Espero que gostem do artigo e por favor deixem comentários se tiverem qualquer dúvida! 


[]s


Referências:
     - Compression in Oracle – Part 1: Basic Table Compression, Jonatham Lewis

2 comments:

 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)