Skip to content

Commit 026426c

Browse files
committed
extended (pgstattuple) version for index/btree bloat estimation
1 parent 47332d9 commit 026426c

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

bloat/btree_pgstattuple.sql

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--https://github.com/dataegret/pg-utils/tree/master/sql
2+
--pgstattuple extension required
3+
--WARNING: without index name/mask query will read all available indexes which could cause I/O spikes
4+
with indexes as (
5+
select * from pg_stat_user_indexes
6+
)
7+
select schemaname,
8+
table_name,
9+
pg_size_pretty(table_size) as table_size,
10+
index_name,
11+
pg_size_pretty(index_size) as index_size,
12+
idx_scan as index_scans,
13+
round((free_space*100/index_size)::numeric, 1) as waste_percent,
14+
pg_size_pretty(free_space) as waste
15+
from (
16+
select schemaname, p.relname as table_name, indexrelname as index_name,
17+
(select (case when avg_leaf_density = 'NaN' then 0
18+
else greatest(ceil(index_size * (1 - avg_leaf_density / (coalesce((SELECT (regexp_matches(reloptions::text, E'.*fillfactor=(\\d+).*'))[1]),'90')::real)))::bigint, 0) end)
19+
from pgstatindex(schemaname || '.' || p.indexrelid::regclass::text)
20+
) as free_space,
21+
pg_relation_size(p.indexrelid) as index_size,
22+
pg_relation_size(p.relid) as table_size,
23+
idx_scan
24+
from indexes p
25+
join pg_class c on p.indexrelid = c.oid
26+
where pg_get_indexdef(p.indexrelid) like '%USING btree%' and
27+
--put your index name/mask here
28+
indexrelname ~ ''
29+
) t
30+
order by free_space desc;
31+

0 commit comments

Comments
 (0)