ARTIGO ATUALIZADO EM 19/11/2018
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:
- Comprime os dados em até 10x;
- Ótimo para ambientes OLAP ou tabelas de histórico de dados;
- 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:
- É ótimo para ambientes OLTP;
- Sintaxe para uso: COMPRESS FOR OLTP (ou COMPRESS FOR ALL OPERATIONS, comando utilizado até a versão 11GR1);
- 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.
-- 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%.
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
- Compression in Oracle – Part 1: Basic Table Compression, Jonatham Lewis
- Data Compression in Oracle, Carl Dudley
mais um blog perfeito e me ajudou bastante.
ResponderExcluirObrigado Cleber pelo feedback.
Excluir