Estou trabalhando com PostgreSQL e tenho uma preocupação com o inchaço da tabela ao adicionar uma nova coluna a uma tabela existente. Entendo que o PostgreSQL usa Multi-Version Concurrency Control (MVCC) e autovacuum para recuperar espaço de linhas antigas.
Aqui está o cenário:
Digamos que eu tenha uma tabela nomeada example_table
com dados existentes e decido adicionar uma nova coluna, por exemplo, new_column
de um tipo de dados maior:
ALTER TABLE example_table ADD COLUMN new_column VARCHAR(255);
Além disso, atualizarei a nova coluna com novos valores:
UPDATE example_table SET new_column = 'some_value';
Pelo que entendi, após esta operação, as linhas antigas são marcadas como mortas e o autovacuum eventualmente recuperará o espaço. No entanto, as linhas antigas eram de tamanho menor em comparação com as novas linhas com a coluna adicionada.
Tenho as seguintes perguntas:
- Como o PostgreSQL (especificamente, Autovacuum) lida com o espaço recuperado de linhas antigas, considerando a diferença de tamanho entre as linhas antigas e as novas?
- Esse processo levará potencialmente ao inchaço da tabela, já que as tuplas mortas não podem ser reutilizadas devido à diferença de tamanho?
- É necessário executar um VACUUM FULL para recuperar espaço com eficiência em tal cenário, ou o autovacuum lidará com isso de forma adequada?
Se os novos valores forem literais constantes, você poderá adicionar a coluna já preenchida sem criar nenhuma tupla morta:
Se você tiver que fazer isso como um UPDATE, o espaço livre gerado eventualmente será reutilizável. VACUUM irá desfragmentar o espaço livre de múltiplas tuplas antigas (na mesma página) para que possa ser usado para novas tuplas maiores. Supondo, é claro, que haja tuplas antigas suficientes em qualquer página para adicionar essa quantidade de espaço livre. Fazer isso requer um bloqueio “superexclusivo” na página, mas é improvável que seja um problema de grande escala e de longo prazo.