Estou procurando ajuda prática para resolver problemas de espaço em disco em bancos de dados. Já visitei estas páginas:
- Postgres: Recuperando Espaço
- Tamanho atual de uma tabela PostgreSQL (vs espaço em disco usado)
- https://stackoverflow.com/questions/41991380/whats-the-difference-between-pg-table-size-pg-relation-size-pg-total-relatio
No meu contexto ainda tenho algumas dúvidas: tenho um banco de dados com 100GB de espaço em disco. Uma tabela está relatando o uso de 73 GB de espaço de consulta:
select
quote_ident(table_schema) || '.' || quote_ident(table_name),
pg_size_pretty(pg_total_relation_size(quote_ident(table_schema) || '.' || quote_ident(table_name))) as disk_size
from
information_schema.tables
where
pg_total_relation_size(quote_ident(table_schema) || '.' || quote_ident(table_name)) > 100000
order by
pg_total_relation_size(quote_ident(table_schema) || '.' || quote_ident(table_name)) desc;
Os desenvolvedores estão me dizendo que excluíram muitas linhas da tabela mencionada. Como posso verificar isso?
pg_total_relation_size
retorna informações sobre o disco usado, VACUUM ANALYZE
apenas o espaço livre disponível, mas não o espaço em disco. Assim pg_total_relation_size
ainda retornará o mesmo valor, certo?
No meu entendimento, se eu executar VACUUM ANALYZE
ele irá atualizar alguma referência no gerenciamento de espaço que o banco de dados pode usar para novas linhas. Existe alguma maneira prática de comparar o espaço em disco usado e o tamanho real da tabela? É possível com pgstattuple ou pg_freespacemap? Se sim, você poderia fornecer um exemplo de consulta?
Também encontrei algumas consultas verificando pg_catalog.pg_stat_all_tables
o retorno da quantidade de n_dead_tup
e n_live_tup
. Depois de a, VACUUM ANALYZE
eles seriam limpos, verificando assim o total de tuplas mortas após a VACUUM ANALYZE
para ver se o VACUUM FULL
espaço livre não seria um bom indicador?
Use a extensão pgstattuple. Ele mostrará quanto da tabela está ocupada por dados do usuário, lixo e espaço vazio:
Isso executará uma varredura sequencial na mesa. Há também
pgstattuple_approx
algo útil para tabelas grandes: ele verifica apenas parte da tabela e extrapola os números.Para verificar todas as tabelas em um banco de dados, você poderia
Se o vácuo padrão (não COMPLETO) já tiver sido feito, você poderá ver quanto espaço livre contabilizado existe em uma tabela específica com algo como:
Ou se você se preocupa com quantos blocos têm pelo menos x quantidade de espaço livre, você pode escrever uma consulta para fazer isso. É apenas SQL, tem toda a flexibilidade que o SQL possui.
Se as tuplas foram excluídas, mas ainda não foram limpas por vácuo, então pgstattuple seria a maneira de avaliar isso. (Ou apenas execute o vácuo e use pg_freespace).