WITHtable_scansas(SELECTrelid,tables.idx_scan+tables.seq_scanasall_scans,(tables.n_tup_ins+tables.n_tup_upd+tables.n_tup_del)aswrites,pg_relation_size(relid)astable_sizeFROMpg_stat_user_tablesastables),all_writesas(SELECTsum(writes)astotal_writesFROMtable_scans),indexesas(SELECTidx_stat.relid,idx_stat.indexrelid,idx_stat.schemaname,idx_stat.relnameastablename,idx_stat.indexrelnameasindexname,idx_stat.idx_scan,pg_relation_size(idx_stat.indexrelid)asindex_bytes,indexdef~*'USING btree'ASidx_is_btreeFROMpg_stat_user_indexesasidx_statJOINpg_indexUSING(indexrelid)JOINpg_indexesasindexesONidx_stat.schemaname=indexes.schemanameANDidx_stat.relname=indexes.tablenameANDidx_stat.indexrelname=indexes.indexnameWHEREpg_index.indisunique=FALSE),index_ratiosAS(SELECTschemaname,tablename,indexname,idx_scan,all_scans,round((CASEWHENall_scans=0THEN0.0::NUMERICELSEidx_scan::NUMERIC/all_scans*100END),2)asindex_scan_pct,writes,round((CASEWHENwrites=0THENidx_scan::NUMERICELSEidx_scan::NUMERIC/writesEND),2)asscans_per_write,pg_size_pretty(index_bytes)asindex_size,pg_size_pretty(table_size)astable_size,idx_is_btree,index_bytesFROMindexesJOINtable_scansUSING(relid)),index_groupsAS(SELECT'Never Used Indexes'asreason,*,1asgrpFROMindex_ratiosWHEREidx_scan=0andidx_is_btreeUNIONALLSELECT'Low Scans, High Writes'asreason,*,2asgrpFROMindex_ratiosWHEREscans_per_write<=1andindex_scan_pct<10andidx_scan>0andwrites>100andidx_is_btreeUNIONALLSELECT'Seldom Used Large Indexes'asreason,*,3asgrpFROMindex_ratiosWHEREindex_scan_pct<5andscans_per_write>1andidx_scan>0andidx_is_btreeandindex_bytes>100000000UNIONALLSELECT'High-Write Large Non-Btree'asreason,index_ratios.*,4asgrpFROMindex_ratios,all_writesWHERE(writes::NUMERIC/(total_writes+1))>0.02ANDNOTidx_is_btreeANDindex_bytes>100000000ORDERBYgrp,index_bytesDESC)SELECTreason,schemaname,tablename,indexname,index_scan_pct,scans_per_write,index_size,table_sizeFROMindex_groups;