Compressão de tabelas no Oracle Database

Por Fabio Prado Oracle ACE
Postado em Agosto 2016

Revisado por Marcelo Pivovar - Solution Architect

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 usuarios 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). Principais diferenças 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

Outro ponto que acho interessante comentar, para fins de aprendizado, é o conceito des compressão x deduplicação. Apesar do nome dos recursos apresentados sugerir que há compressão de dados, na verdade o que o Oracle faz nestes casos não é compressão, mas sim deduplicação de dados. Para mais informações sugiro a leitura do artigo Compression in Oracle – Part 1: Basic Table Compression allthingsoracle.com/compression-oracle-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 banco de dados 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%).

Por hoje é só! Espero que gostem do artigo! 

Referências:
- Compression in Oracle – Part 1: Basic Table Compression, Jonatham Lewis:
http://allthingsoracle.com/compression-oracle-basic-table-compression/

- Data Compression in Oracle, Carl Dudley:
http://pt.slideshare.net/carldudley/compression-ow2009-r2

- Oracle Advanced Compression with OracleDatabase 12c, Oracle Corporation:
http://www.oracle.com/technetwork/database/options/compression/advanced-compression-wp-12c-1896128.pdf

- O MITO QUE A COMPRESSÃO DE DADOS É IGUAL A DESDUPLICAÇÃO:
http://www.aliancatecnologia.com/conteudo/2015/05/compressao-de-dados-e-desduplicacao/


Fabio Prado atua na área de tecnologia desde o ano de 2000, possui experiência e profundos conhecimentos em Análise de Sistemas, programação (Dot Net) e Administração de Bancos de Dados Oracle. É DBA em uma empresa do governo, instrutor na empresa de treinamentos FABIOPRADO.NET, Oracle ACE Member, Organizador do DBA BRASIL e autor do blog fabioprado.net.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.