Olá, neste rápido artigo iremos explorar uma ferramenta chamada Vacuum. O Vacuum é um utilitário que deve ser usado pelo DBA como manutenção diária do Banco de Dados. Não creio que exista um banco com um utilitário como esse, o qual precisa ser utilizado praticamente diariamente. No entanto, o vacuum existe devido ao controle exclusivo de transação que o postgreSQL possui: o MVCC. As duas principais operações realizadas por essa ferramenta são:

  1. Recuperar espaço em disco devido a registros atualizados ou deletados;
  2. Atualizar as estatísticas utilizadas pelo otimizador para determinar o modo mais eficiente de executar uma conusulta no PostgreSQL.

Quando realizamos um UPDATE o registro propriamente dito não é alterado; é incluído um novo registro clone. Sendo assim, o PostgreSQL marca o registro "original" (antigo) como expirado e realiza a alteração no clone. Se for um DELETE, o PostgreSQL apenas marca o registro deletado como expirado. Por isso, é normal vermos a base de dados crescer de forma descomunal no PostgreSQL e as pesquisas começarem a ficar cada vez mais lentas. Esta lentidão fica mais visível principalmente se a consulta não for indexada e for utilizado acesso seqüencial, que faz com que o PostgreSQL verifique TODOS os registros (incluindo os expirados) para localizar o dado. No caso do Índice, ele é o responsável por localizar o dado.

figura1

Quando executamos o Vacuum, o mesmo remove fisicamente o dado expirado, pega os dois últimos registros da tabela e joga no lugar do “buraco”.

figura2

No segundo caso, o PostgreSQL analisa a quantidade de registros, relacionamentos e índices para atualizar uma feature do PostgreSQL chamada “query planner”. Esta funcionalidade analisa as tabelas gerando informações úteis ao PostgreSQL a fim de que as queries consigam ser aproveitadas de uma maneira mais eficiente em tempo de execução.

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ tabela ]

VACUUM [ FULL ] [ FREEZE ]

[ VERBOSE ] ANALYZE [ tabela [ (coluna [, ...] )] ]

FULL Seleciona uma limpeza "completa", que pode recuperar mais espaço, mas é muito mais demorada e bloqueia a tabela em modo exclusivo.
FREEZE Seleciona um "congelamento" agressivo das tuplas.
VERBOSE Produz um relatório detalhado da atividade de limpeza de cada tabela.
ANALYZE Atualiza as estatísticas utilizadas pelo otimizador para determinar o modo mais eficiente de executar uma consulta.
tabela O nome da tabela específica a ser limpa. O padrão é que sejam todas as tabelas do banco de dados corrente.
coluna O nome da coluna específica a ser analisada. O padrão é que sejam todas as colunas.
:sql_magazine=> VACUUM VERBOSE ANALYZE tabela_teste;

Poderiamos executar no Prompt de Comando do Sistema Operacional, através de um script chamado vacuumdb:


        #vacuumdb –a –f –z –v

Executando o vacuum em TODOS OS BANCOS existentes no PostgreSQL.

-a Todos os Banco de Dados.
-f Full
VERBOSE Analyze
-z Exibe mensagens de debug
tabela Exibe mensagens de debug.
-v O nome da coluna específica a ser analisada. O padrão é que sejam todas as colunas.

Se fôssemos fazer exatamente como no commando VACUUM VERBOSE ANALYSE tabela_teste>, seria:


#vacuumdb –t tabela_teste banco_teste –v –z BANCO

É muito importante usar diariamente o Vacuum, por isso, não se esqueça deste utilitário pois ele nos poupa dor de cabeça. Uma boa forma é usar o gerenciador de tarefas agendadas do sistema Operacional (no caso do Linux, o cron). Eu sempre executo um Vacuum às 23:00h. (antes do meu backup) e às 4:00 h. (antes dos operadores iniciarem o trabalho).

Um dado importante: O Vaccum FULL usa acesso exclusive da Tabela, ou seja, poderá travar a tabela (lock), se necessitar ser executado com operadores conectados. Execute o vacuum sem o parâmetro FULL.

Iisso é tudo, pessoal. Acredito que com essa dica rápida sobre o Vacuum, conseguimos aprender rapidamente como funciona e como utilizar este utilitário do PostgreSQL. Qualquer dúvida ou sujestão, estou às ordens.

Abraços e até logo,