postgresql 需要清理的表,需要重建的索引

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/ctypyb2002/article/details/84785664

生产上的 autovacuum 一般是要打开的,除此之外,还需要定时监控业务数据库的表。

表 根据 age 查看

– select * from pg_class
– select * from pg_namespace

select current_database() as datname,
       pn.nspname||'.'||pc.relname as nspname_relname,
       --' vacuum verbose '||pn.nspname||'.'||pc.relname||' ;' as vacuum_rel,
       --' vacuum full verbose '||pn.nspname||'.'||pc.relname||' ;' as vacuum_full_rel,
       pc.relkind,
       pc.relfrozenxid,
       pc.relminmxid,
       age(pc.relfrozenxid) as age_relfrozenxid,
       txid_current() as txid_curr,
       pg_size_pretty(pg_total_relation_size(pc.oid)) as total_relation_size,
       pg_size_pretty(pg_table_size(pc.oid)) as table_size,
       pg_size_pretty(pg_indexes_size(pc.oid)) as indexes_size
  from pg_class pc
       left outer join pg_namespace pn
                    on pc.relnamespace = pn.oid
 where 1=1
   and pc.relkind in ('r')
   and pn.nspname not in ('pg_catalog','information_schema')
   and pn.nspname not like 'pg_toast%'
   and pg_table_size(pc.oid) >= 100*1024*1024
 order by age(pc.relfrozenxid) desc,
          pg_table_size(pc.oid) desc
;

表 根据live row,dead row 查看

– select * from pg_stat_all_tables
– select * from pg_class

select current_database() as datname,
       pt.schemaname||'.'||pt.relname as schemaname_relname,
       --' vacuum verbose '||pt.schemaname||'.'||pc.relname||' ;' as vacuum_rel,
       --' vacuum full verbose '||pt.schemaname||'.'||pc.relname||' ;' as vacuum_full_rel,
       pc.relfrozenxid,
       age(pc.relfrozenxid) as age_relfrozenxid,
       txid_current() as txid_curr,
       pg_size_pretty(pg_total_relation_size(pt.relid)) as total_relation_size,
       pg_size_pretty(pg_table_size(pt.relid)) as table_size,
       pg_size_pretty(pg_indexes_size(pt.relid)) as indexes_size,
       pt.n_live_tup,
       pt.n_dead_tup,
       round(case when (pt.n_live_tup+pt.n_dead_tup) = 0 then 0.0000
                  else pt.n_dead_tup/((pt.n_live_tup+pt.n_dead_tup) *1.0) 
              end,4) as dead_tup_lv
  from pg_stat_all_tables pt
       left outer join pg_class pc
                    on pt.relid=pc.oid
 where 1=1
   and pt.schemaname not in ('pg_catalog','information_schema')
   and pt.schemaname not like 'pg_toast%'
   and pg_table_size(pt.relid) >= 100*1024*1024
 order by case when (pt.n_live_tup+pt.n_dead_tup) = 0 then 0
               else pt.n_dead_tup/((pt.n_live_tup+pt.n_dead_tup) *1.0) 
           end desc
;

索引

– select * from pg_index
– select * from pg_class
– select * from pg_namespace

select 
      current_database(),
      pn2.nspname||'.'||pc2.relname as nspname_relname,
      pn.nspname||'.'||pc.relname as nspname_indexname,
      round(100 * pg_relation_size(idx.indexrelid)/pg_relation_size(idx.indrelid))/100 as index_ratio,
      pg_size_pretty(pg_relation_size(idx.indexrelid)) as index_size,
      pg_size_pretty(pg_relation_size(idx.indrelid)) as table_size
 from pg_index idx
      left outer join pg_class pc
                   on idx.indexrelid=pc.oid
      left outer join pg_namespace pn
                   on pc.relnamespace=pn.oid
      left outer join pg_class pc2
                   on idx.indrelid=pc2.oid
      left outer join pg_namespace pn2
                   on pc2.relnamespace=pn2.oid             
where 1=1
  --and pc2.relname='table name'
  and pn.nspname not in ('pg_catalog','information_schema')
  and pn.nspname not like 'pg_toast%'
  and pc.relkind = 'i'
  and pc2.relkind = 'r'
  and pg_relation_size(idx.indrelid) > 0
  and pg_relation_size(idx.indrelid) > 100*1024*1024
order by  --pg_relation_size(idx.indexrelid),
         --pg_relation_size(idx.indrelid),
         round(100 * pg_relation_size(idx.indexrelid)/pg_relation_size(idx.indrelid))/100 desc
          
;

猜你喜欢

转载自blog.csdn.net/ctypyb2002/article/details/84785664