O assunto de hoje vai ser Postgres.
Como todos deveriam saber, o postgres usa o conceito de MVCC (see more on http://en.wikipedia.org/wiki/Multiversion_concurrency_control), ou seja, ele tem o histórico de todas as linhas que de alguma forma entraram no banco.
Isso é feito para ganhar velocidade e permitir consultas em várias transações ao mesmo tempo. Esta regra só é quebrada no truncate (TRUNCATE is transaction-safe, however: the truncation will be safely rolled back if the surrounding transaction does not commit.)
Isso basicamente quer dizer, quando você faz um UPDATE/DELETE o “valor” do registro antigo ainda está no disco, de alguma forma, guardado, que pode, ocasionalmente, ser lido por uma transação, ou ser esquecido como se fosse uma “memory leak”.
Mas calma, isso é normal.
Quando você faz um truncate, o banco remove todos os registros no disco, por isso é tão rápido, e libera também todo o espaço no disco.(após o commit).
Vacuum
O vacuum no postgres, foi criado para fazer a limpeza desses registros “mortos”, melhorando a velocidade do banco de dados, geralmente ele é utilizado junto com o comando Analyse, que já faz algumas estatísticas para melhorar o GEQO (planejador das estratégias para executar a query).
Porém, o vacuum, sem ser utilizado o parâmetro FULL, apenas analisa os dados mortos, tira dos índices e se, no não tiver ninguém usando aquela tabela, ele talvez vai tirar os dados mortos, se ele estiverem no “final” do arquivo.
There are two variants of the VACUUM command. The first form, known as “lazy vacuum” or just VACUUM, marks expired data in tables and indexes for future reuse; it does not attempt to reclaim the space used by this expired data unless the space is at the end of the table and an exclusive table lock can be easily obtained.)
O VACUUM FULL faz um lock exclusive na tabela e faz a limpa verdadeira e quando termina ele libera o espaço em disco. Continue reading
A um bom tempo atrás, quando eu fazia programas em Delphi, e estava programando scripts Lua para otservers, eu fiz esse programa para auxiliar-me.