|
3 | 3 | --https://github.com/dataegret/pg-utils/tree/master/sql |
4 | 4 | --pgstattuple extension required |
5 | 5 | --WARNING: without index name/mask query will read all available indexes which could cause I/O spikes |
6 | | -with indexes as ( |
7 | | - select * from pg_stat_user_indexes |
8 | | -) |
9 | | -select schemaname, |
10 | | -table_name, |
11 | | -pg_size_pretty(table_size) as table_size, |
12 | | -index_name, |
13 | | -pg_size_pretty(index_size) as index_size, |
14 | | -idx_scan as index_scans, |
15 | | -round((free_space*100/index_size)::numeric, 1) as waste_percent, |
16 | | -pg_size_pretty(free_space) as waste |
17 | | -from ( |
18 | | - select schemaname, p.relname as table_name, indexrelname as index_name, |
19 | | - (select (case when avg_leaf_density = 'NaN' then 0 |
20 | | - else greatest(ceil(index_size * (1 - avg_leaf_density / (coalesce((SELECT (regexp_matches(reloptions::text, E'.*fillfactor=(\\d+).*'))[1]),'90')::real)))::bigint, 0) end) |
21 | | - from pgstatindex(schemaname || '.' || p.indexrelid::regclass::text) |
| 6 | +with data as ( |
| 7 | + select |
| 8 | + schemaname as schema_name, |
| 9 | + p.relname as table_name, |
| 10 | + (select spcname from pg_tablespace where oid = c_table.reltablespace) as table_tblspace, |
| 11 | + (select spcname from pg_tablespace where oid = c.reltablespace) as index_tblspace, |
| 12 | + indexrelname as index_name, |
| 13 | + ( |
| 14 | + select (case when avg_leaf_density = 'NaN' then 0 |
| 15 | + else greatest(ceil(index_size * (1 - avg_leaf_density / (coalesce((SELECT (regexp_matches(c.reloptions::text, E'.*fillfactor=(\\d+).*'))[1]),'90')::real)))::bigint, 0) end) |
| 16 | + from pgstatindex(p.indexrelid::regclass::text) |
22 | 17 | ) as free_space, |
23 | 18 | pg_relation_size(p.indexrelid) as index_size, |
24 | 19 | pg_relation_size(p.relid) as table_size, |
25 | 20 | idx_scan |
26 | | - from indexes p |
27 | | - join pg_class c on p.indexrelid = c.oid |
28 | | - where pg_get_indexdef(p.indexrelid) like '%USING btree%' and |
| 21 | + from pg_stat_user_indexes p |
| 22 | + join pg_class c on p.indexrelid = c.oid |
| 23 | + join pg_class c_table on p.relid = c_table.oid |
| 24 | + where |
| 25 | + pg_get_indexdef(p.indexrelid) like '%USING btree%' |
29 | 26 | --put your index name/mask here |
30 | | - indexrelname ~ '' |
31 | | -) t |
| 27 | + and indexrelname ~ '' |
| 28 | +) |
| 29 | +select |
| 30 | + coalesce(nullif(schema_name, 'public') || '.', '') || table_name || coalesce(' [' || table_tblspace || ']', '') as "Table", |
| 31 | + coalesce(nullif(schema_name, 'public') || '.', '') || index_name || coalesce(' [' || index_tblspace || ']', '') as "Index", |
| 32 | + pg_size_pretty(table_size) as "Table size", |
| 33 | + pg_size_pretty(index_size) as "Index size", |
| 34 | + idx_scan as "Index Scans", |
| 35 | + round((free_space*100/index_size)::numeric, 1) as "Wasted, %", |
| 36 | + pg_size_pretty(free_space) as "Wasted" |
| 37 | +from data |
32 | 38 | order by free_space desc; |
33 | 39 |
|
0 commit comments