【HAVENT 原创】PostgreSQL 查询和手动缩表

一、查询 pgsql 自动清理的历史统计信息

-- 查询 pgsql 自动清理的历史统计信息
SELECT relname                              表名,
       seq_scan                             全表扫描记录数,
       idx_scan                             索引扫描次数,
       idx_tup_fetch                        索引扫描记录数,
       n_tup_ins                            插入的条数,
       n_tup_upd                            更新的条数,
       n_tup_del                            删除的条数,
       n_tup_hot_upd                        热更新条数,
       n_live_tup                           活动元组估计数,
       n_dead_tup                           死亡元组估计数,
       last_vacuum                          最后一次手动清理时间,
       last_autovacuum                      最后一次自动清理时间,
       last_analyze                         最后一次手动分析时间,
       last_autoanalyze                     最后一次自动分析时间,
       vacuum_count                         手动清理的次数,
       autovacuum_count                     自动清理的次数,
       analyze_count                        手动分析此表的次数,
       autoanalyze_count                    自动分析此表的次数,
       (CASE
            WHEN n_live_tup > 0 THEN n_dead_tup :: float8 / n_live_tup :: float8
            ELSE 0 END) ::NUMERIC(12, 2) AS "死/活元组的比例"
FROM pg_stat_all_tables
WHERE schemaname = 'public'
ORDER BY n_dead_tup::float8 DESC;

二、查询 psql 当前数据库表已经达到自动清理条件的表及相关信息

-- 查询 psql 当前数据库表已经达到自动清理条件的表及相关信息
SELECT c.relname                                                                           表名,
       (current_setting('autovacuum_analyze_threshold')::NUMERIC(12, 4)) +
       (current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12, 4)) * reltuples AS 自动分析阈值,
       (current_setting('autovacuum_vacuum_threshold')::NUMERIC(12, 4)) +
       (current_setting('autovacuum_vacuum_scale_factor')::NUMERIC(12, 4)) * reltuples  AS 自动清理阈值,
       reltuples::DECIMAL(19, 0)                                                           活元组数,
       n_dead_tup::DECIMAL(19, 0)                                                          死元组数
FROM pg_class c
         LEFT JOIN pg_stat_all_tables d
                   ON C.relname = d.relname
WHERE c.relname LIKE 'tb%'
  AND reltuples > 0
  AND n_dead_tup > (current_setting('autovacuum_analyze_threshold')::NUMERIC(12, 4)) +
                   (current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12, 4)) * reltuples;

三、查询 pgsql 正在进行自动清理的表及相关信息

-- 查询 pgsql 正在进行自动清理的表及相关信息
SELECT c.relname           对象名称,
       l.pid               进程id,
       psa.STATE           查询状态,
       psa.query           执行语句,
       now() - query_start 持续时间
FROM pg_locks l
         INNER JOIN pg_stat_activity psa ON (psa.pid = l.pid)
         LEFT OUTER JOIN pg_class C ON (l.relation = C.oid)
WHERE psa.query like 'autovacuum%'
  and l.fastpath = 'f'
ORDER BY query_start asc;

四、查看用例下所有数据库的磁盘空间占用情况

-- 查看用例下所有数据库的磁盘空间占用情况
SELECT table_schema || '.' || table_name AS table_full_name,
       pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') desc;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章