Atualmente, uso o MySQL para um banco de dados muito grande (1 TB), excluo linhas diariamente para não exceder 1 TB. Mas eu enfrentei este problema Howto: Limpar um mecanismo de armazenamento mysql InnoDB? . Eu quero mudar para o PostgreSQL para evitar esse problema. (baseado em conselhos de outros)
Minhas perguntas são:
- Se eu mudar para o PostgreSQL esse problema vai resolver?
- Se minha ideia é ruim, qual é a melhor solução para minha situação?
No MySQL (InnoDB), você pode excluir linhas para liberar espaço para novas linhas. No entanto, devido à organização dos BTrees, não é 1:1. Nem mesmo 1000:1000. Ou seja, se você excluir mil linhas em uma "ponta" da tabela, isso pode ou não permitir que você adicione mil linhas na outra "ponta".
Além disso, você disse, "excluir do banco de dados". Se isso significa excluir de uma tabela na esperança de poder inserir em uma tabela diferente , você está sem sorte.
Forneça alguns detalhes mais específicos, incluindo pelo menos o arquivo
SHOW CREATE TABLE
.Pode ser que
PARTITION BY RANGE
seja útil. Esse é um dos poucos usosPARTITION
no MySQL. Ele permite o descarte muito rápido de blocos de dados 'antigos', como o valor de um dia a cada mês. Mas há ressalvas. Mais uma vez, mais detalhes me permitiriam elaborar.Se o
DELETE
também estiver causando um problema de desempenho, posso aconselhar melhor. (Novamente, são necessários mais detalhes.)No PostgreSQL, uma tabela normalmente não diminui se você excluir algumas linhas, mas o espaço vazio pode ser reutilizado para novas linhas. O mesmo se aplica a entradas de índice, mas como Rick James respondeu, a reutilização de espaço pode não funcionar tão bem.
Ainda assim, você deve estar fundamentalmente bem, contanto que não utilize seu espaço em disco até o limite.
No entanto, a maneira do rei de resolver seu problema seria usar o particionamento e descartar partições em vez de excluir linhas.
Tentando apenas responder ao título da pergunta. mas acredito que o OP está perguntando como retornar o tablespace de volta ao sistema operacional no PostgreSQL. Existem dois métodos:
VACUUM FULL
para compactar o(s) arquivo(s) da tabela. Isso copia os dados da tabela para um novo arquivo e reconstrói todos os índices da tabela, portanto, não é rápido (dependendo da quantidade de dados existentes) e bloqueia o acesso à tabela durante o andamento.DROP TABLE
desvincula os arquivos da tabela, devolvendo seu espaço ao SO imediatamente.Referências: