O pg_repack é uma extensão do PostgreSQL que permite remover o inchaço de tabelas e índices e, opcionalmente, restaurar a ordem física dos índices agrupados. Ao contrário de CLUSTER e VACUUM FULL, ele funciona on-line, sem manter um bloqueio exclusivo nas tabelas processadas durante o processamento. O pg_repack é eficiente para inicializar, com desempenho comparável ao uso direto do CLUSTER.
Abaixo temos um exemplo da sua utilização:
1 - Instalação
-- Centos 8 com PostgreSQL 12
dnf install pg_repack12
2 - Alterar o parâmetro shared_preload_libraries, essa variável especifica uma ou mais bibliotecas compartilhadas a serem pré-carregadas no início do servidor.
psql
ALTER SYSTEM SET shared_preload_libraries TO 'pg_repack';
SELECT pg_reload_conf();
psql -c "SHOW shared_preload_libraries;";
SQL3 - Restart PostgreSQL
systemctl restart postgresql-12
4 - Vamos criar um banco e dar carga em uma tabela de exemplo.
psql -c "create database producao;"
psql
\c producao
CREATE TABLE tb_aluno(
id_aluno SERIAL,
nome VARCHAR(80),
curso VARCHAR(80),
descricao text,
data timestamp,
PRIMARY KEY(id_aluno)
);
-- Carga de dados
INSERT INTO tb_aluno (nome,curso,descricao,data)
SELECT 'Aluno '||generate_series nome,'Curso '||generate_series curso,'Teste de carga Laboratorio '||generate_series||'.' texto ,NOW()
FROM generate_series(1,200000);
SQL5 - Verificar o tamanho atual do banco producao e da tabela tb_aluno.
psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;";
psql
\c producao
SELECT pg_size_pretty( pg_total_relation_size('tb_aluno') );
SQL6 - Conectar no PostgreSQL e criar a extensão.
psql
\c producao -- criar no banco
CREATE EXTENSION pg_repack;
SQL7 - Apagar informações
\c producao
delete from tb_aluno;
8 - Verificar tamanho apos o delete da tabela tb_aluno.
psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;";
psql
\c producao
SELECT pg_size_pretty( pg_total_relation_size('tb_aluno') );
SQL9 - Executar o pg_repack com paralelismo de 3 jobs
PATH=/usr/pgsql-12/bin; export PATH
/usr/pgsql-12/bin/pg_repack --table=public.tb_aluno --jobs=3 producao
10 - Verificar tamanho apos o delete da tabela tb_aluno.
psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;";
psql
\dt
SQL