PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL - banco de dados restaurado menor que o original


A resposta curta é que o armazenamento de banco de dados é mais otimizado para velocidade do que espaço.

Por exemplo, se você inseriu 100 linhas em uma tabela e excluiu todas as linhas com um ID de número ímpar, o DBMS poderia escrever uma nova tabela com apenas 50 linhas, mas é mais eficiente simplesmente marcar as linhas excluídas como espaço livre e reutilize-os na próxima inserção de uma linha. Portanto, a tabela ocupa o dobro do espaço necessário atualmente.

O uso de "MVCC" do Postgres, em vez de bloqueio, para gerenciamento de transações torna isso ainda mais provável, uma vez que um UPDATE geralmente envolve escrever uma nova linha no armazenamento e, em seguida, marcar a linha antiga excluída quando nenhuma transação estiver olhando para ela.

Ao despejar e restaurar o banco de dados, você está recriando um banco de dados sem todo esse espaço livre. Isso é essencialmente o que o VACUUM FULL comando faz - ele reescreve os dados atuais em um novo arquivo e, em seguida, exclui o arquivo antigo.

Existe uma extensão distribuída com Postgres chamada pg_freespace que permite examinar um pouco disso. por exemplo. você pode listar o tamanho da tabela principal (não incluindo índices e colunas armazenados em tabelas "TOAST") separadas e o espaço livre usado por cada tabela com o seguinte:
Select oid::regclass::varchar as table,
      pg_size_pretty(pg_relation_size(oid)/1024 * 1024) As size,
      pg_size_pretty(sum(free)) As free
 From (
   Select c.oid,
       (pg_freespace(c.oid)).avail As free
     From pg_class c
     Join pg_namespace n on n.oid = c.relnamespace
    Where c.relkind = 'r'
      And n.nspname Not In ('information_schema', 'pg_catalog')
 ) tbl
 Group By oid
 Order By pg_relation_size(oid) Desc, sum(free) Desc;