@ -1,7 +1,7 @@
\ prompt ' This utility will read tables with given mask using pgstattuple extension and return top 20 bloated tables.\nWARNING: without table mask query will read all available tables which could cause I/O spikes.\nPlease enter mask for table name (check all tables if nothing is specified): ' tablename
- - pgstattuple extension required
- - pgstattuple extension required
- - WARNING : without table name / mask query will read all available tables which could cause I / O spikes
- - WARNING : without table name / mask query will read all available tables which could cause I / O spikes
select nspname ,
select table_name ,
relname ,
pg_size_pretty ( relation_size + toast_relation_size ) as total_size ,
pg_size_pretty ( relation_size + toast_relation_size ) as total_size ,
pg_size_pretty ( toast_relation_size ) as toast_size ,
pg_size_pretty ( toast_relation_size ) as toast_size ,
round ( ( ( relation_size - ( relation_size - free_space ) * 100 / fillfactor ) * 100 / greatest ( relation_size , 1 ) ) : : numeric , 1 ) table_waste_percent ,
round ( ( ( relation_size - ( relation_size - free_space ) * 100 / fillfactor ) * 100 / greatest ( relation_size , 1 ) ) : : numeric , 1 ) table_waste_percent ,
@ -9,7 +9,8 @@ pg_size_pretty((relation_size - (relation_size - free_space)*100/fillfactor)::bi
round ( ( ( toast_free_space + relation_size - ( relation_size - free_space ) * 100 / fillfactor ) * 100 / greatest ( relation_size + toast_relation_size , 1 ) ) : : numeric , 1 ) total_waste_percent ,
round ( ( ( toast_free_space + relation_size - ( relation_size - free_space ) * 100 / fillfactor ) * 100 / greatest ( relation_size + toast_relation_size , 1 ) ) : : numeric , 1 ) total_waste_percent ,
pg_size_pretty ( ( toast_free_space + relation_size - ( relation_size - free_space ) * 100 / fillfactor ) : : bigint ) total_waste
pg_size_pretty ( ( toast_free_space + relation_size - ( relation_size - free_space ) * 100 / fillfactor ) : : bigint ) total_waste
from (
from (
select nspname , relname ,
select
( case when n . nspname = ' public ' then format ( ' %I ' , c . relname ) else format ( ' %I.%I ' , n . nspname , c . relname ) end ) as table_name ,
( select free_space from pgstattuple ( c . oid ) ) as free_space ,
( select free_space from pgstattuple ( c . oid ) ) as free_space ,
pg_relation_size ( c . oid ) as relation_size ,
pg_relation_size ( c . oid ) as relation_size ,
( case when reltoastrelid = 0 then 0 else ( select free_space from pgstattuple ( c . reltoastrelid ) ) end ) as toast_free_space ,
( case when reltoastrelid = 0 then 0 else ( select free_space from pgstattuple ( c . reltoastrelid ) ) end ) as toast_free_space ,
@ -20,7 +21,7 @@ from (
where nspname not in ( ' pg_catalog ' , ' information_schema ' )
where nspname not in ( ' pg_catalog ' , ' information_schema ' )
and nspname ! ~ ' ^pg_toast ' and nspname ! ~ ' ^pg_temp ' and relkind in ( ' r ' , ' m ' ) and ( relpersistence = ' p ' or not pg_is_in_recovery ( ) )
and nspname ! ~ ' ^pg_toast ' and nspname ! ~ ' ^pg_temp ' and relkind in ( ' r ' , ' m ' ) and ( relpersistence = ' p ' or not pg_is_in_recovery ( ) )
- - put your table name / mask here
- - put your table name / mask here
and relname ~ ' '
and relname ~ : ' tablename '
) t
) t
order by ( toast_free_space + relation_size - ( relation_size - free_space ) * 100 / fillfactor ) desc
order by ( toast_free_space + relation_size - ( relation_size - free_space ) * 100 / fillfactor ) desc
limit 20 ;
limit 20 ;